【2024年华为OD机试】(B卷,100分)- 热点网站统计(Java JS PythonC/C++)
一、问题描述
题目描述
企业路由器的统计页面需要动态统计公司访问最多的网页URL的Top N。设计一个算法,能够高效动态统计Top N的页面。
输入描述
每一行都是一个URL或一个数字:
- 如果是URL,代表一段时间内的网页访问。
- 如果是数字N,代表本次需要输出的Top N个URL。
输入约束:
- 总访问网页数量小于5000个,单网页访问次数小于65535次。
- 网页URL仅由字母、数字和点分隔符组成,且长度小于等于127字节。
- 数字是正整数,小于等于10且小于当前总访问网页数。
输出描述
每行输入对应一行输出,输出按访问次数排序的前N个URL,用逗号分隔。
输出要求:
- 每次输出要统计之前所有输入,而不仅仅是本次输入。
- 如果有访问次数相等的URL,按URL的字符串字典序升序排列,输出排序靠前的URL。
用例
用例 1
输入:
news.qq.com
news.sina.com.cn
news.qq.com
news.qq.com
game.163.com
game.163.com
www.huawei.com
www.cctv.com
3
www.huawei.com
www.cctv.com
www.huawei.com
www.cctv.com
www.huawei.com
www.cctv.com
www.huawei.com
www.cctv.com
www.huawei.com
3
输出:
news.qq.com,game.163.com,news.sina.com.cn
www.huawei.com,www.cctv.com,news.qq.com
说明:
- 第一次输出时,统计了之前所有输入的URL访问次数,输出Top 3。
- 第二次输出时,继续统计了所有输入的URL访问次数,输出Top 3。
用例 2
输入:
news.qq.com
www.cctv.com
1
www.huawei.com
www.huawei.com
2
3
输出:
news.qq.com
www.huawei.com,news.qq.com
www.huawei.com,news.qq.com,www.cctv.com
说明:
- 第一次输出时,统计了之前所有输入的URL访问次数,输出Top 1。
- 第二次输出时,继续统计了所有输入的URL访问次数,输出Top 2。
- 第三次输出时,继续统计了所有输入的URL访问次数,输出Top 3。
题目解析
核心逻辑
-
动态统计:
- 每次输入URL时,更新该URL的访问次数。
- 每次输入数字N时,输出当前访问次数最多的Top N个URL。
-
统计范围:
- 每次输出时,统计的是之前所有输入的URL访问次数,而不仅仅是本次输入。
-
排序规则:
- 按访问次数从高到低排序。
- 如果访问次数相同,按URL的字典序升序排列。
-
性能优化:
- 由于总访问网页数量小于5000个,单网页访问次数小于65535次,因此需要设计一个高效的算法,确保每次统计和输出的时间复杂度尽可能低。
关键点
-
数据结构选择:
- 使用哈希表(如
unordered_map
)来存储每个URL的访问次数,确保更新和查询的时间复杂度为O(1)。 - 使用优先队列(如堆)或排序算法来快速获取Top N的URL。
- 使用哈希表(如
-
动态更新:
- 每次输入URL时,更新哈希表中的访问次数。
- 每次输入数字N时,从哈希表中提取所有URL及其访问次数,进行排序并输出Top N。
-
排序规则实现:
- 在排序时,先按访问次数降序排序,如果访问次数相同,再按URL的字典序升序排序。
-
输出格式:
- 输出时,将Top N的URL用逗号分隔。
注意事项
-
统计范围:
- 每次输出时,统计的是之前所有输入的URL访问次数,而不仅仅是本次输入。
-
性能优化:
- 由于总访问网页数量较大(最多5000个),单网页访问次数较多(最多65535次),需要确保算法的效率。
-
边界条件:
- 输入的数字N必须小于等于10且小于当前总访问网页数。
- 输入的URL长度不超过127字节。
总结
本题的核心在于动态统计URL的访问次数,并在每次输入数字N时快速输出Top N的URL。通过合理选择数据结构和排序算法,可以高效地实现这一功能。
二、JavaScript算法源码
这段代码实现了一个简单的URL统计和排序功能。它通过读取用户输入,统计每个URL出现的次数,并根据用户指定的数量n
,返回出现次数最多的前n
个URL。以下是代码的详细注释和讲解:
// 引入readline模块,用于从标准输入读取数据
const rl = require("readline").createInterface({ input: process.stdin });// 获取异步迭代器,用于逐行读取输入
var iter = rl[Symbol.asyncIterator]();// 定义一个异步函数readline,用于读取下一行输入
const readline = async () => (await iter.next()).value;// 使用立即执行函数表达式(IIFE)来执行异步代码
void (async function () {// 定义一个缓存对象,用于存储URL及其出现的次数const cache = {};// 进入一个无限循环,持续读取用户输入while (true) {// 等待读取下一行输入const line = await readline();// 判断输入是否为纯数字(即用户要求输出前n个URL)if (/^\d+$/.test(line)) {// 如果是数字,调用sortURL函数并输出结果console.log(sortURL(parseInt(line)));} else {// 如果不是数字,说明是URL,更新缓存中的统计次数cache[line] ? cache[line]++ : (cache[line] = 1);}}// 定义一个函数sortURL,用于根据URL的出现次数进行排序并返回前n个URLfunction sortURL(n) {// 将缓存对象转换为数组,每个元素是一个[key, value]的数组return Object.entries(cache)// 对数组进行排序.sort((a, b) => {// 首先按出现次数降序排序const res = b[1] - a[1];// 如果出现次数相同,则按URL的字典序升序排序return res == 0 ? (a[0] > b[0] ? 1 : -1) : res;})// 截取前n个元素.slice(0, n)// 将每个元素的key(即URL)提取出来.map((entry) => entry[0])// 将URL数组用逗号连接成一个字符串.join(",");}
})();
代码讲解:
-
引入
readline
模块:readline
模块用于从标准输入(如终端)逐行读取数据。这里通过createInterface
方法创建了一个接口,并将其输入流设置为process.stdin
。
-
异步迭代器:
rl[Symbol.asyncIterator]()
返回一个异步迭代器,允许我们使用await
逐行读取输入。
-
readline
函数:- 这是一个异步函数,每次调用时会返回输入流的下一行内容。
-
立即执行函数表达式 (IIFE):
void (async function () { ... })();
是一个立即执行的异步函数表达式,用于在代码加载时立即执行异步操作。
-
缓存对象
cache
:cache
是一个普通的JavaScript对象,用于存储URL及其出现的次数。键是URL,值是该URL出现的次数。
-
主循环:
- 代码进入一个无限循环,不断读取用户输入。
- 如果输入是纯数字(通过正则表达式
/^\d+$/
判断),则调用sortURL
函数并输出结果。 - 如果输入不是数字,则认为是URL,更新
cache
中该URL的计数。
-
sortURL
函数:- 该函数接受一个参数
n
,表示要返回的前n
个URL。 Object.entries(cache)
将cache
对象转换为一个数组,数组的每个元素是一个[key, value]
的数组,其中key
是URL,value
是出现次数。sort
方法对数组进行排序:- 首先按出现次数降序排序(
b[1] - a[1]
)。 - 如果出现次数相同,则按URL的字典序升序排序(
a[0] > b[0] ? 1 : -1
)。
- 首先按出现次数降序排序(
slice(0, n)
截取排序后的前n
个元素。map((entry) => entry[0])
提取每个元素的URL。join(",")
将URL数组用逗号连接成一个字符串并返回。
- 该函数接受一个参数
示例运行:
假设输入如下:
https://example.com
https://example.com
https://example.org
https://example.net
https://example.net
https://example.net
2
程序会输出:
https://example.net,https://example.com
解释:
https://example.net
出现了3次,https://example.com
出现了2次,https://example.org
出现了1次。- 用户输入
2
,表示要输出出现次数最多的前2个URL,因此输出https://example.net,https://example.com
。
总结:
这段代码通过简单的缓存和排序机制,实现了对URL出现次数的统计和排序功能。它适用于处理小规模的输入数据,但对于大规模数据,可能需要更高效的算法和数据结构。
三、Java算法源码
这段Java代码实现了一个与之前JavaScript代码类似的功能:统计URL出现的次数,并根据用户输入的正整数n
,返回出现次数最多的前n
个URL。以下是代码的详细注释和讲解:
代码详解
import java.util.HashMap;
import java.util.Objects;
import java.util.Scanner;
import java.util.StringJoiner;
import java.util.regex.Pattern;public class Main {// 正则表达式,用于判断一个字符串是否为正整数static Pattern reg = Pattern.compile("^\\d+$");// 使用HashMap缓存每个URL及其出现次数static HashMap<String, Integer> cache = new HashMap<>();public static void main(String[] args) {// 创建Scanner对象,用于从标准输入读取数据Scanner sc = new Scanner(System.in);// 循环读取每一行输入while (sc.hasNextLine()) {String tmp = sc.nextLine();// 判断输入是否为正整数if (reg.matcher(tmp).find()) {// 如果是正整数,调用sortURL方法并输出结果System.out.println(sortURL(Integer.parseInt(tmp)));} else {// 如果是URL,更新缓存中的统计次数cache.put(tmp, cache.getOrDefault(tmp, 0) + 1);}}}// 根据URL出现次数排序并返回前n个URLpublic static String sortURL(int n) {// 使用StringJoiner将结果用逗号连接StringJoiner sj = new StringJoiner(",");// 对缓存中的URL进行排序cache.entrySet().stream().sorted((a, b) ->// 首先按出现次数降序排序Objects.equals(a.getValue(), b.getValue())// 如果出现次数相同,则按URL的字典序升序排序? a.getKey().compareTo(b.getKey()): b.getValue() - a.getValue())// 限制只取前n个URL.limit(n)// 提取URL.map(ele -> ele.getKey())// 将URL添加到StringJoiner中.forEach(url -> sj.add(url));// 返回最终的字符串结果return sj.toString();}
}
代码讲解
1. 正则表达式 Pattern reg
Pattern.compile("^\\d+$")
用于匹配一个字符串是否为正整数。^
表示字符串的开始,\d+
表示一个或多个数字,$
表示字符串的结束。- 在代码中,
reg.matcher(tmp).find()
用于判断输入字符串tmp
是否为正整数。
2. 缓存 HashMap<String, Integer> cache
cache
是一个HashMap
,用于存储URL及其出现的次数。- 键(
key
)是URL(String
类型),值(value
)是该URL出现的次数(Integer
类型)。
3. 主方法 main
- 使用
Scanner
从标准输入逐行读取数据。 - 如果输入是正整数,调用
sortURL
方法并输出结果。 - 如果输入是URL,更新
cache
中该URL的计数:cache.getOrDefault(tmp, 0)
:如果tmp
已经存在于cache
中,则返回其值;否则返回默认值0
。cache.put(tmp, cache.getOrDefault(tmp, 0) + 1)
:将URL的计数加1。
4. sortURL
方法
- 该方法接受一个整数
n
,表示要返回的前n
个URL。 - 使用
StringJoiner
将结果用逗号连接。 - 对
cache
中的URL进行排序:cache.entrySet().stream()
:将cache
转换为流(Stream
),便于后续操作。sorted(...)
:对流中的元素进行排序:- 首先按出现次数降序排序(
b.getValue() - a.getValue()
)。 - 如果出现次数相同,则按URL的字典序升序排序(
a.getKey().compareTo(b.getKey())
)。
- 首先按出现次数降序排序(
limit(n)
:限制只取前n
个URL。map(ele -> ele.getKey())
:提取每个元素的URL。forEach(url -> sj.add(url))
:将URL添加到StringJoiner
中。
- 最终返回
StringJoiner
的结果。
示例运行
假设输入如下:
https://example.com
https://example.com
https://example.org
https://example.net
https://example.net
https://example.net
2
程序会输出:
https://example.net,https://example.com
解释:
https://example.net
出现了3次,https://example.com
出现了2次,https://example.org
出现了1次。- 用户输入
2
,表示要输出出现次数最多的前2个URL,因此输出https://example.net,https://example.com
。
代码优化建议
总结
这段Java代码通过 HashMap
统计URL的出现次数,并通过流(Stream
)对结果进行排序和限制,最终输出前 n
个URL。代码结构清晰,功能明确,适合处理小规模数据。对于大规模数据,可能需要进一步优化性能。
四、Python算法源码
这段Python代码实现了一个与之前JavaScript和Java代码类似的功能:统计URL出现的次数,并根据用户输入的正整数n
,返回出现次数最多的前n
个URL。以下是代码的详细注释和讲解:
代码详解
# 缓存字典,记录每个URL出现的次数
cache = {}# 题解列表(未使用,可以删除)
ans = []# 定义sortURL函数,用于根据URL出现次数排序并返回前n个URL
def sortURL(n):# 将cache字典转换为列表,每个元素是一个(key, value)的元组urlCount = list(cache.items())# 对列表进行排序# key=lambda x: (-x[1], x[0]) 表示:# 1. 首先按出现次数降序排序(-x[1])# 2. 如果出现次数相同,则按URL的字典序升序排序(x[0])urlCount.sort(key=lambda x: (-x[1], x[0]))# 使用map提取前n个URL,并用逗号连接成一个字符串return ",".join(map(lambda x: x[0], urlCount[:n]))# 主循环,持续读取用户输入
while True:# 读取一行输入tmp = input()# 判断输入是否为正整数if tmp.isnumeric():# 如果是正整数,调用sortURL函数并输出结果print(sortURL(int(tmp)))else:# 如果是URL,更新缓存中的统计次数if cache.get(tmp) is None:# 如果URL不在缓存中,初始化次数为1cache[tmp] = 1else:# 如果URL已经在缓存中,次数加1cache[tmp] += 1
代码讲解
1. 缓存字典 cache
cache
是一个字典,用于存储URL及其出现的次数。- 键(
key
)是URL(str
类型),值(value
)是该URL出现的次数(int
类型)。
2. sortURL
函数
- 该函数接受一个整数
n
,表示要返回的前n
个URL。 cache.items()
将cache
字典转换为一个列表,列表的每个元素是一个(key, value)
的元组。urlCount.sort(key=lambda x: (-x[1], x[0]))
对列表进行排序:- 首先按出现次数降序排序(
-x[1]
)。 - 如果出现次数相同,则按URL的字典序升序排序(
x[0]
)。
- 首先按出现次数降序排序(
map(lambda x: x[0], urlCount[:n])
提取前n
个URL。",".join(...)
将URL列表用逗号连接成一个字符串并返回。
3. 主循环
- 使用
while True
进入一个无限循环,持续读取用户输入。 tmp = input()
读取一行输入。- 判断输入是否为正整数:
- 如果是正整数,调用
sortURL
函数并输出结果。 - 如果不是正整数,则认为是URL,更新
cache
中该URL的计数:- 如果URL不在
cache
中,初始化次数为1。 - 如果URL已经在
cache
中,次数加1。
- 如果URL不在
- 如果是正整数,调用
示例运行
假设输入如下:
https://example.com
https://example.com
https://example.org
https://example.net
https://example.net
https://example.net
2
程序会输出:
https://example.net,https://example.com
解释:
https://example.net
出现了3次,https://example.com
出现了2次,https://example.org
出现了1次。- 用户输入
2
,表示要输出出现次数最多的前2个URL,因此输出https://example.net,https://example.com
。
代码优化建议
-
输入结束条件:
- 当前代码是一个无限循环,可以通过特定的输入(如
exit
)来结束程序。
- 当前代码是一个无限循环,可以通过特定的输入(如
-
异常处理:
- 可以增加对非法输入的处理,例如非正整数或空输入。
-
性能优化:
- 如果输入数据量较大,可以考虑使用更高效的数据结构(如
collections.Counter
)来统计URL出现次数。
- 如果输入数据量较大,可以考虑使用更高效的数据结构(如
-
代码简化:
cache.get(tmp) is None
可以简化为tmp not in cache
。map(lambda x: x[0], urlCount[:n])
可以简化为列表推导式[x[0] for x in urlCount[:n]]
。
优化后的代码
from collections import Counter# 缓存字典,记录每个URL出现的次数
cache = Counter()# 定义sortURL函数,用于根据URL出现次数排序并返回前n个URL
def sortURL(n):# 对cache字典进行排序sorted_urls = sorted(cache.keys(), key=lambda x: (-cache[x], x))# 返回前n个URL,用逗号连接return ",".join(sorted_urls[:n])# 主循环,持续读取用户输入
while True:# 读取一行输入tmp = input()# 判断输入是否为正整数if tmp.isnumeric():# 如果是正整数,调用sortURL函数并输出结果print(sortURL(int(tmp)))else:# 如果是URL,更新缓存中的统计次数cache[tmp] += 1
优化点
-
使用
collections.Counter
:Counter
是一个专门用于计数的字典子类,可以简化代码逻辑。
-
简化排序逻辑:
- 直接对
cache.keys()
进行排序,避免转换为列表。
- 直接对
-
代码更简洁:
- 使用
Counter
后,代码逻辑更加清晰和简洁。
- 使用
总结
这段Python代码通过字典统计URL的出现次数,并通过排序和限制返回前 n
个URL。代码逻辑清晰,适合处理小规模数据。通过优化,代码可以更加简洁和高效。
五、C/C++算法源码:
C++ 实现
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <sstream>using namespace std;// 缓存map,记录每个URL出现的次数
map<string, int> cache;// sortURL函数,用于根据URL出现次数排序并返回前n个URL
string sortURL(int n) {// 将map转换为vector,便于排序vector<pair<string, int>> urlCount(cache.begin(), cache.end());// 对vector进行排序// 使用lambda表达式定义排序规则:// 1. 首先按出现次数降序排序// 2. 如果出现次数相同,则按URL的字典序升序排序sort(urlCount.begin(), urlCount.end(), [](const pair<string, int>& a, const pair<string, int>& b) {if (a.second != b.second) {return a.second > b.second; // 按次数降序} else {return a.first < b.first; // 按URL升序}});// 提取前n个URLstringstream result;for (int i = 0; i < n && i < urlCount.size(); ++i) {if (i > 0) {result << ",";}result << urlCount[i].first;}return result.str();
}int main() {string tmp;// 主循环,持续读取用户输入while (getline(cin, tmp)) {// 判断输入是否为正整数bool isNumber = true;for (char ch : tmp) {if (!isdigit(ch)) {isNumber = false;break;}}if (isNumber) {// 如果是正整数,调用sortURL函数并输出结果int n = stoi(tmp);cout << sortURL(n) << endl;} else {// 如果是URL,更新缓存中的统计次数cache[tmp]++;}}return 0;
}
C++ 代码讲解
-
map<string, int> cache
:- 使用
map
存储URL及其出现次数,键为URL(string
类型),值为出现次数(int
类型)。
- 使用
-
sortURL
函数:- 将
map
转换为vector<pair<string, int>>
,便于排序。 - 使用
sort
函数对vector
进行排序,排序规则为:- 首先按出现次数降序排序。
- 如果出现次数相同,则按URL的字典序升序排序。
- 使用
stringstream
将前n
个URL用逗号连接成一个字符串并返回。
- 将
-
主循环:
- 使用
getline(cin, tmp)
逐行读取输入。 - 判断输入是否为正整数:
- 如果是正整数,调用
sortURL
函数并输出结果。 - 如果是URL,更新
cache
中该URL的计数。
- 如果是正整数,调用
- 使用
-
输入结束条件:
- 当前代码是一个无限循环,可以通过特定的输入(如
exit
)来结束程序。
- 当前代码是一个无限循环,可以通过特定的输入(如
C 语言实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_URL_LENGTH 1000
#define MAX_URLS 10000// 定义URL结构体
typedef struct {char url[MAX_URL_LENGTH];int count;
} URLCount;// 缓存数组,记录每个URL及其出现次数
URLCount cache[MAX_URLS];
int cacheSize = 0;// 比较函数,用于排序
int compare(const void* a, const void* b) {URLCount* urlA = (URLCount*)a;URLCount* urlB = (URLCount*)b;// 首先按出现次数降序排序if (urlA->count != urlB->count) {return urlB->count - urlA->count;}// 如果出现次数相同,则按URL的字典序升序排序return strcmp(urlA->url, urlB->url);
}// sortURL函数,用于根据URL出现次数排序并返回前n个URL
void sortURL(int n) {// 对缓存数组进行排序qsort(cache, cacheSize, sizeof(URLCount), compare);// 输出前n个URLfor (int i = 0; i < n && i < cacheSize; ++i) {if (i > 0) {printf(",");}printf("%s", cache[i].url);}printf("\n");
}// 判断字符串是否为正整数
int isNumeric(const char* str) {for (int i = 0; str[i] != '\0'; ++i) {if (str[i] < '0' || str[i] > '9') {return 0;}}return 1;
}int main() {char tmp[MAX_URL_LENGTH];// 主循环,持续读取用户输入while (fgets(tmp, sizeof(tmp), stdin)) {// 去掉换行符tmp[strcspn(tmp, "\n")] = '\0';// 判断输入是否为正整数if (isNumeric(tmp)) {// 如果是正整数,调用sortURL函数并输出结果int n = atoi(tmp);sortURL(n);} else {// 如果是URL,更新缓存中的统计次数int found = 0;for (int i = 0; i < cacheSize; ++i) {if (strcmp(cache[i].url, tmp) == 0) {cache[i].count++;found = 1;break;}}if (!found) {// 如果URL不在缓存中,添加到缓存strcpy(cache[cacheSize].url, tmp);cache[cacheSize].count = 1;cacheSize++;}}}return 0;
}
C 语言代码讲解
-
URLCount
结构体:- 用于存储URL及其出现次数,包含两个字段:
url
:URL字符串。count
:URL出现次数。
- 用于存储URL及其出现次数,包含两个字段:
-
cache
数组:- 使用数组存储URL及其出现次数,
cacheSize
记录当前缓存的大小。
- 使用数组存储URL及其出现次数,
-
compare
函数:- 用于
qsort
排序的比较函数,规则为:- 首先按出现次数降序排序。
- 如果出现次数相同,则按URL的字典序升序排序。
- 用于
-
sortURL
函数:- 使用
qsort
对cache
数组进行排序。 - 输出前
n
个URL,用逗号分隔。
- 使用
-
isNumeric
函数:- 判断字符串是否为正整数。
-
主循环:
- 使用
fgets
逐行读取输入。 - 判断输入是否为正整数:
- 如果是正整数,调用
sortURL
函数并输出结果。 - 如果是URL,更新
cache
中该URL的计数。
- 如果是正整数,调用
- 使用
总结
- C++ 实现:利用了STL的
map
和vector
,代码简洁高效。 - C 语言实现:使用数组和结构体,适合对内存和性能有严格要求的场景。
- 两种实现都遵循了相同的逻辑:统计URL出现次数,排序并输出前
n
个URL。
六、尾言
什么是华为OD?
华为OD(Outsourcing Developer,外包开发工程师)是华为针对软件开发工程师岗位的一种招聘形式,主要包括笔试、技术面试以及综合面试等环节。尤其在笔试部分,算法题的机试至关重要。
为什么刷题很重要?
-
机试是进入技术面的第一关:
华为OD机试(常被称为机考)主要考察算法和编程能力。只有通过机试,才能进入后续的技术面试环节。 -
技术面试需要手撕代码:
技术一面和二面通常会涉及现场编写代码或算法题。面试官会注重考察候选人的思路清晰度、代码规范性以及解决问题的能力。因此提前刷题、多练习是通过面试的重要保障。 -
入职后的可信考试:
入职华为后,还需要通过“可信考试”。可信考试分为三个等级:- 入门级:主要考察基础算法与编程能力。
- 工作级:更贴近实际业务需求,可能涉及复杂的算法或与工作内容相关的场景题目。
- 专业级:最高等级,考察深层次的算法以及优化能力,与薪资直接挂钩。
刷题策略与说明:
2024年8月14日之后,华为OD机试的题库转为 E卷,由往年题库(D卷、A卷、B卷、C卷)和全新题目组成。刷题时可以参考以下策略:
-
关注历年真题:
- 题库中的旧题占比较大,建议优先刷历年的A卷、B卷、C卷、D卷题目。
- 对于每道题目,建议深度理解其解题思路、代码实现,以及相关算法的适用场景。
-
适应新题目:
- E卷中包含全新题目,需要掌握全面的算法知识和一定的灵活应对能力。
- 建议关注新的刷题平台或交流群,获取最新题目的解析和动态。
-
掌握常见算法:
华为OD考试通常涉及以下算法和数据结构:- 排序算法(快速排序、归并排序等)
- 动态规划(背包问题、最长公共子序列等)
- 贪心算法
- 栈、队列、链表的操作
- 图论(最短路径、最小生成树等)
- 滑动窗口、双指针算法
-
保持编程规范:
- 注重代码的可读性和注释的清晰度。
- 熟练使用常见编程语言,如C++、Java、Python等。
如何获取资源?
-
官方参考:
- 华为招聘官网或相关的招聘平台会有一些参考信息。
- 华为OD的相关公众号可能也会发布相关的刷题资料或学习资源。
-
加入刷题社区:
- 找到可信的刷题交流群,与其他备考的小伙伴交流经验。
- 关注知名的刷题网站,如LeetCode、牛客网等,这些平台上有许多华为OD的历年真题和解析。
-
寻找系统性的教程:
- 学习一本经典的算法书籍,例如《算法导论》《剑指Offer》《编程之美》等。
- 完成系统的学习课程,例如数据结构与算法的在线课程。
积极心态与持续努力:
刷题的过程可能会比较枯燥,但它能够显著提升编程能力和算法思维。无论是为了通过华为OD的招聘考试,还是为了未来的职业发展,这些积累都会成为重要的财富。
考试注意细节
-
本地编写代码
- 在本地 IDE(如 VS Code、PyCharm 等)上编写、保存和调试代码,确保逻辑正确后再复制粘贴到考试页面。这样可以减少语法错误,提高代码准确性。
-
调整心态,保持冷静
- 遇到提示不足或实现不确定的问题时,不必慌张,可以采用更简单或更有把握的方法替代,确保思路清晰。
-
输入输出完整性
- 注意训练和考试时都需要编写完整的输入输出代码,尤其是和题目示例保持一致。完成代码后务必及时调试,确保功能符合要求。
-
快捷键使用
- 删除行可用
Ctrl+D
,复制、粘贴和撤销分别为Ctrl+C
,Ctrl+V
,Ctrl+Z
,这些可以正常使用。 - 避免使用
Ctrl+S
,以免触发浏览器的保存功能。
- 删除行可用
-
浏览器要求
- 使用最新版的 Google Chrome 浏览器完成考试,确保摄像头开启并正常工作。考试期间不要切换到其他网站,以免影响考试成绩。
-
交卷相关
- 答题前,务必仔细查看题目示例,避免遗漏要求。
- 每完成一道题后,点击【保存并调试】按钮,多次保存和调试是允许的,系统会记录得分最高的一次结果。完成所有题目后,点击【提交本题型】按钮。
- 确保在考试结束前提交试卷,避免因未保存或调试失误而丢分。
-
时间和分数安排
- 总时间:150 分钟;总分:400 分。
- 试卷结构:2 道一星难度题(每题 100 分),1 道二星难度题(200 分)。及格分为 150 分。合理分配时间,优先完成自己擅长的题目。
-
考试环境准备
- 考试前请备好草稿纸和笔。考试中尽量避免离开座位,确保监控画面正常。
- 如需上厕所,请提前规划好时间以减少中途离开监控的可能性。
-
技术问题处理
- 如果考试中遇到断电、断网、死机等技术问题,可以关闭浏览器并重新打开试卷链接继续作答。
- 出现其他问题,请第一时间联系 HR 或监考人员进行反馈。
祝你考试顺利,取得理想成绩!
相关文章:
【2024年华为OD机试】(B卷,100分)- 热点网站统计(Java JS PythonC/C++)
一、问题描述 题目描述 企业路由器的统计页面需要动态统计公司访问最多的网页URL的Top N。设计一个算法,能够高效动态统计Top N的页面。 输入描述 每一行都是一个URL或一个数字: 如果是URL,代表一段时间内的网页访问。如果是数字N&#…...
脚本运行禁止:npm 无法加载文件,因为在此系统上禁止运行脚本
问题与处理策略 1、问题描述 npm install -D tailwindcss执行上述指令,报如下错误 npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。 有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_…...
AI软件栈:LLVM分析(一)
文章目录 AI 软件栈后端编译LLVM IRLLVM的相关子项目AI 软件栈后端编译 AI软件栈的后端工作通常与硬件架构直接相关,为了实现一个既能适配现代编程语言、硬件架构发展的目标,所以提出了LLVM具备多阶段优化能力提供基础后端描述,便于进行编译器开发兼容标准编译器的行为LLVM …...
【Elasticsearch】 Intervals Query
Elasticsearch Intervals Query 返回基于匹配术语的顺序和接近度的文档。 intervals 查询使用 匹配规则,这些规则由一小组定义构建而成。这些规则然后应用于指定 field 中的术语。 这些定义生成覆盖文本中术语的最小间隔序列。这些间隔可以进一步由父源组合和过滤…...
Ansys Maxwell:采用对称性的双转子轴向磁通电机
轴向磁通电机因其功率密度高于相同重量的传统径向磁通电机而变得非常受欢迎,并且在电动汽车和航空应用中非常高效且具有成本效益。功率密度是输出功率与机器体积的比率。对于给定尺寸的机器,轴向磁通电机提供更大的扭矩和功率,或者对于给定的…...
你的连接不是专用连接
当你打开网站看到如下提示,说明SSL证书到期了。 攻击者可能试图www窃取你的信息(例如、密码、消息或信用卡)。详细了解此警告 NET::ERR_CERT_DATE_INVALID 此服务器无法证明它是WWW ;它的安全证书已于2天前到期。这可能是错误配置或攻击者…...
CSS核心
CSS的引入方式 内部样式表是在 html 页面内部写一个 style 标签,在标签内部编写 CSS 代码控制整个 HTML 页面的样式。<style> 标签理论上可以放在 HTML 文档的任何地方,但一般会放在文档的 <head> 标签中。 <style> div { color: r…...
AI常见的算法和例子
人工智能(AI)中常见的算法分为多个领域,如机器学习、深度学习、强化学习、自然语言处理和计算机视觉等。以下是一些常见的算法及其用途: 例子代码:纠结哥/pytorch_learn 1. 机器学习 (Machine Learning) 监督学习 (S…...
无公网IP 外网访问 本地部署夫人 hello-algo
hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…...
【QT】 控件 -- 显示类
🔥 目录 [TOC]( 🔥 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 🔥 1. 前言 之前我在上一篇文章【QT】…...
AI语言模型竞争加剧:新秀崛起 格局生变
标题:AI语言模型竞争加剧:新秀崛起 格局生变 文章信息摘要: AI语言模型领域呈现加速发展和分化态势。在LMSYS排行榜上,Claude 3 Opus超越GPT-4 Turbo,DBRX超越Mixtral成为最佳开源模型,显示领先位置更替频…...
RK3568使用opencv(使用摄像头捕获图像数据显示)
文章目录 一、opencv相关的类1. **cv::VideoCapture**2. **cv::Mat**3. **cv::cvtColor**4. **QImage**5. **QPixmap**总结 二、代码实现 一、opencv相关的类 1. cv::VideoCapture cv::VideoCapture 是 OpenCV 中用于视频捕捉的类,常用于从摄像头、视频文件、或者…...
leetcode——排序链表(java)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3: …...
Windows安装Miniconda和PySide6以及配置PyCharm
目录 1. 选择Miniconda 2. 下载Miniconda 3. 安装Miniconda 4. 在base环境下创建pyside6环境 5. 安装pyside6环境 6. 配置PyCharm环境 7. 运行第一个程序效果 1. 选择Miniconda 选择Miniconda而没有选择Anaconda,是因为它是一个更小的Anaconda发行版&#x…...
floodfill算法(6题)
本质就是找出性质相似的连通块 目录 1.图像渲染 2.岛屿数量 3.岛屿的最大面积 4.被围绕的区域 5.太平洋大西洋水流问题 6.扫雷游戏 1.图像渲染 733. 图像渲染 - 力扣(LeetCode) 我们使用深度优先遍历去遍历即可,也不需要返回值。 值得…...
Spring集成Redis|通用Redis工具类
一、基础使用 概述 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis需要 那些步骤呢。 1、 JedisPoolConfig (这个是配置连接池) 2、 RedisConnectionFactory 这个是配置连接信息,这里的RedisConnectionFactory是一个接 …...
python:洛伦兹变换
洛伦兹变换(Lorentz transformations)是相对论中的一个重要概念,特别是在讨论时空的变换时非常重要。在四维时空的背景下,洛伦兹变换描述了在不同惯性参考系之间如何变换时间和空间坐标。在狭义相对论中,洛伦兹变换通常…...
题单:插入排序
题目描述 给定 n 个元素的数组(下标从1开始计),请使用插入排序对其进行排序(升序)。 输入格式 两行,第一行为一个整数 n,表示元素的个数。 第二行 n 个空格分隔的整数,表示数组的…...
【Spring】Spring启示录
目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里,随着项目的增长和需求的变化,如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略
1.30 性能巅峰:NumPy代码优化全攻略 目录 #mermaid-svg-CMVXy3CN2tNmW8RJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CMVXy3CN2tNmW8RJ .error-icon{fill:#552222;}#mermaid-svg-CMVXy3CN2tNmW8RJ …...
C#方法(练习)
1.定义一个函数,输入三个值,找出三个数中的最小值 2.定义一个函数,输入三个值,找出三个数中的最大值 3.定义一个函数,输入三个值,找出三个数中的平均值 4.定义一个函数,计算一个数的 N 次方 Pow(2, 3)返回8 5.传入十一…...
Node.js 的底层原理
Node.js 的底层原理 1. 事件驱动和非阻塞 I/O Node.js 基于 Chrome V8 引擎,使用 JavaScript 作为开发语言。它采用事件驱动和非阻塞 I/O 模型,使其轻量且高效。通过 libuv 库实现跨平台的异步 I/O,包括文件操作、网络请求等。 2. 单线程事…...
react native在windows环境搭建并使用脚手架新建工程
截止到2024-1-11,使用的主要软件的版本如下: 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…...
实战:如何快速让新网站被百度收录?
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/22.html 要让新网站快速被百度收录,可以采取以下实战策略: 一、网站基础优化 网站结构清晰:确保网站的结构简洁清晰,符合百度的抓取规则。主…...
Nuxt:利用public-ip这个npm包来获取公网IP
目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子: <template…...
572. 另一棵树的子树
前导题:100. 相同的树 回顾一下 判断两棵二叉树相同,根结点相同 且 左子树相同 且 右子树相同。 于是判断如下: 根结点都为null,返回true根结点不都为null,返回false根结点都不为null,但是值不相同&#…...
LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略
LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略 目录 STORM系统简介 1、Co-STORM 2、更新新闻 STORM系统安装和使用方法 1、安装 pip安装 直接克隆GitHub仓库 2、模型和数据集 两个数据集 FreshWiki数据集 WildSeek数据集 支持…...
菜鸟之路Day11-12一一集合进阶(四)
菜鸟之路Day11-12一一集合进阶(四) 作者:blue 时间:2025.1.29-1.30 文章目录 菜鸟之路Day11-12一一集合进阶(四)0.概述1.可变参数2.Collections3.综合练习4.不可变的集合5.Stream流 0.概述 内容学习自黑…...
在Ubuntu下编译VLC
参考链接: https://blog.csdn.net/zyhse/article/details/113662686...
python开发,最好的环境是什么
目录 1. 集成开发环境(IDE) 1.1 PyCharm 1.2 Visual Studio Code (VSCode) 2. 文本编辑器 2.1 Sublime Text 2.2 Vim/NeoVim 3. 虚拟环境管理 4. 版本控制与协作 5. 容器化开发 6. 项目管理与依赖管理工具 7. 单元测试与调试 最佳组合推荐 …...
Maui学习笔记- SQLite简单使用案例02添加详情页
我们继续上一个案例,实现一个可以修改当前用户信息功能。 当用户点击某个信息时,跳转到信息详情页,然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…...
创建前端项目的方法
目录 一、创建前端项目的方法 1.前提:安装Vue CLI 2.方式一:vue create项目名称 3.方式二:vue ui 二、Vue项目结构 三、修改Vue项目端口号的方法 一、创建前端项目的方法 1.前提:安装Vue CLI npm i vue/cli -g 2.方式一&…...
好用的AI/解析网站
文件解析 json文件解析:http://www.yunjson.com/jsoncheck/...
C语言练习(31)
有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…...
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL TLS/SSL协议和应用层协议无关,它只是加密应用层协议(比如HTTP)并传递给下层的TCP。 HTTP和TLS/SSL协议组合在一起就是HTTPS, HTTPS等…...
SpringBoot AOP 和 事务
SpringBoot 整合 AOP 动态代理技术 JDK 动态代理 JDK 动态代理是 Java 自带的一种代理方式。它要求目标类必须有接口,基于这个接口,JDK 在运行时会动态生成一个代理对象。这个代理对象和目标对象就像 “拜把子” 的兄弟,因为它们都实现了相同…...
如何使用Python调用大语言模型的API接口?
以下是使用 Python 调用几种常见大语言模型 API 接口的详细步骤和示例代码: 1. 调用 OpenAI 的 GPT 模型 API OpenAI 提供了强大的 GPT 系列模型,使用其 API 需要先注册 OpenAI 账号并获取 API 密钥。 步骤: 安装openai库:pip…...
如何监控ubuntu系统某个程序的运行状态,如果程序出现异常,对其自动重启。
在Ubuntu系统中,可以通过编写脚本结合cron或systemd来监控程序的运行状态,并在程序异常时自动重启。以下是具体步骤: 方法一:使用Shell脚本和Cron 编写监控脚本 创建一个Shell脚本来检查程序是否运行,并在程序异常时重…...
Kafka 压缩算法详细介绍
文章目录 一 、Kafka 压缩算法概述二、Kafka 压缩的作用2.1 降低网络带宽消耗2.2 提高 Kafka 生产者和消费者吞吐量2.3 减少 Kafka 磁盘存储占用2.4 减少 Kafka Broker 负载2.5 降低跨数据中心同步成本 三、Kafka 压缩的原理3.1 Kafka 压缩的基本原理3.2. Kafka 压缩的工作流程…...
启元世界(Inspir.ai)技术浅析(二):深度强化学习
深度强化学习(Deep Reinforcement Learning, DRL)是启元世界在人工智能领域的一项核心技术,广泛应用于游戏AI、智能决策等领域。 一、状态(State) 1.1 概念与作用 **状态(State)**是指智能体对环境的感知,是智能体进行决策的基础。在深度强化学习中,状态通常是一个高…...
在K8s中部署动态nfs存储provisioner
背景 之前,我已经在一台worker node上安装了local lvm 的provisioner来模拟需要本地高IOPS的数据库等stafeful应用的实现。 为了后续给虚拟机里的K8s集群安装可用的metrics和logs监控系统(metrics和logs的时序数据库需要永久存储)࿰…...
SQL注入漏洞之绕过[前端 服务端 waf]限制 以及 防御手法 一篇文章给你搞定
目录 绕过手法 前端代码绕过 后端代码绕过 各种字段进行验证 union 大小写绕过 双写逃过 强制类型判断 引号特殊编码处理。 内联注释绕过 注释符绕过 or/and绕过 空格绕过 防御SQL注入的方法 使用预编译语句 使用存储过程 检查数据类型 绕过手法 前端代码绕过…...
C++ 写一个简单的加减法计算器
************* C topic:结构 ************* Structure is a very intersting issue. I really dont like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits. Like building a house. Wh…...
Effective C++ 规则50:了解 new 和 delete 的合理替换时机
1、背景 在 C 中,new 和 delete 是动态分配内存的核心操作符。然而,直接使用它们有时会增加程序的复杂性,甚至导致内存泄漏和其他问题。因此,了解何时替换 new 和 delete 并选择更适合的内存管理策略,是编写高效、健壮…...
水果实体店品牌数字化:RWA + 智能体落地方案
一、方案背景 随着数字化技术的迅猛发展,实体零售行业正面临前所未有的挑战与机遇。传统的零售模式难以满足消费者对个性化、便捷化、智能化的需求,尤其是在水果等生鲜商品领域,如何通过技术手段提升运营效率、增强顾客体验、拓宽盈利模式&a…...
Docker小游戏 | 使用Docker部署FC-web游戏模拟器
Docker小游戏 | 使用Docker部署FC-web游戏模拟器 前言一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署FC-web游戏模拟器下载镜像创建容器检查容器状态检查服务端口安全设置四、访问FC-web游戏模拟器试玩游戏FC游戏的操作方法…...
【视频+图文详解】HTML基础3-html常用标签
图文教程 html常用标签 常用标签 1. 文档结构 <!DOCTYPE html>:声明HTML文档类型。<html>:定义HTML文档的根元素。<head>:定义文档头部,包含元数据。<title>:设置网页标题,浏览…...
年化19.3%策略集|ctpbee_api替换成openctp整合backtrader实盘方案(代码+数据)
原创内容第782篇,专注量化投资、个人成长与财富自由。 昨天我们把backtraderctpbee的实盘整合代码跑通了,年化19.3%,回撤仅8%的实盘策略,以及backtrader整合CTPBee做实盘(附python代码和数据) 这两周我们加…...
谭浩强C语言程序设计(3) 7章
1、递归实现N的阶乘 c复制 #include <cstdio> // 包含标准输入输出库// 计算n的阶乘 int total 0; // 定义全局变量total用于存储阶乘结果// 递归函数计算阶乘 int fac(int a){// 如果输入的数小于0,输出错误信息if (a < 0){printf("%d < 0,err…...
国产SiC碳化硅功率器件技术成为服务器电源升级的核心引擎
在服务器电源应用中,国产650V碳化硅(SiC)MOSFET逐步取代传统超结(Super Junction, SJ)MOSFET,其核心驱动力源于SiC材料在效率、功率密度、可靠性和长期经济性上的显著优势,叠加产业链成熟与政策…...