【2024年华为OD机试】(B卷,100分)- 计算最接近的数 (Java JS PythonC/C++)
一、问题描述
题目解析
我们需要找到一个下标 i
,使得表达式 X[i] - X[i + 1] - ... - X[i + K - 1]
的结果最接近于数组的中位数。如果有多个 i
满足条件,则返回最大的 i
。
关键点:
- 中位数计算:
- 将数组排序后,中位数是
X[N/2]
,其中N
是数组的长度。
- 将数组排序后,中位数是
- 滑动窗口计算:
- 对于每个窗口
[i, i + K - 1]
,计算表达式X[i] - X[i + 1] - ... - X[i + K - 1]
。 - 使用滑动窗口优化计算,避免重复计算。
- 对于每个窗口
- 状态转移:
- 当窗口右移时,新的窗口结果可以通过旧窗口结果推导出来:
new_window = old_window - X[i - 1] + 2 * X[i] - X[i + K - 1]
- 这是因为在新窗口中,
X[i]
从负变正,而X[i + K - 1]
是新加入的负值。
- 当窗口右移时,新的窗口结果可以通过旧窗口结果推导出来:
代码实现
以下是完整的代码实现,包括输入输出处理和核心逻辑:
1. 输入输出处理
# 输入处理
def get_input():# 示例输入:[50, 50, 2, 3], 2input_str = input().strip() # 读取输入x_str, k_str = input_str.split('],') # 分割数组和Kx = list(map(int, x_str[1:].split(','))) # 解析数组k = int(k_str) # 解析Kreturn x, k# 输出处理
def print_output(result):print(result)
2. 核心逻辑
def find_closest_index(x, k):n = len(x)mid = sorted(x)[n // 2] # 计算中位数# 初始化窗口结果window = x[0]for i in range(1, k):window -= x[i]min_diff = abs(window - mid) # 当前最小差距result = 0 # 结果下标# 滑动窗口for i in range(1, n - k + 1):# 状态转移window = window - x[i - 1] + 2 * x[i] - x[i + k - 1]# 计算当前差距diff = abs(window - mid)# 更新结果if diff < min_diff or (diff == min_diff and i > result):min_diff = diffresult = ireturn result
3. 主函数
def main():x, k = get_input() # 获取输入result = find_closest_index(x, k) # 计算结果print_output(result) # 输出结果if __name__ == "__main__":main()
代码详细注释
1. 输入处理
def get_input():input_str = input().strip() # 读取输入并去除首尾空格x_str, k_str = input_str.split('],') # 分割数组和Kx = list(map(int, x_str[1:].split(','))) # 解析数组k = int(k_str) # 解析Kreturn x, k
- 功能:从控制台读取输入并解析为数组
x
和整数k
。 - 关键点:
input().strip()
:读取输入并去除首尾空格。split('],')
:将输入字符串分割为数组部分和K
部分。map(int, x_str[1:].split(','))
:将数组部分解析为整数列表。
2. 核心逻辑
def find_closest_index(x, k):n = len(x)mid = sorted(x)[n // 2] # 计算中位数# 初始化窗口结果window = x[0]for i in range(1, k):window -= x[i]min_diff = abs(window - mid) # 当前最小差距result = 0 # 结果下标# 滑动窗口for i in range(1, n - k + 1):# 状态转移window = window - x[i - 1] + 2 * x[i] - x[i + k - 1]# 计算当前差距diff = abs(window - mid)# 更新结果if diff < min_diff or (diff == min_diff and i > result):min_diff = diffresult = ireturn result
- 功能:找到使表达式结果最接近于中位数的下标
i
。 - 关键点:
- 中位数计算:
sorted(x)[n // 2]
。 - 窗口初始化:计算第一个窗口的结果
window = x[0] - x[1] - ... - x[k - 1]
。 - 滑动窗口:
- 使用状态转移公式更新窗口结果。
- 计算当前窗口结果与中位数的差距。
- 更新最小差距和结果下标。
- 中位数计算:
3. 主函数
def main():x, k = get_input() # 获取输入result = find_closest_index(x, k) # 计算结果print_output(result) # 输出结果if __name__ == "__main__":main()
- 功能:调用输入处理、核心逻辑和输出处理函数,完成整个流程。
示例运行
输入:
[50,50,2,3],2
输出:
1
解释:
- 中位数为
50
。 - 窗口计算结果:
i = 0
:50 - 50 = 0
,差距为|0 - 50| = 50
。i = 1
:50 - 2 = 48
,差距为|48 - 50| = 2
。i = 2
:2 - 3 = -1
,差距为|-1 - 50| = 51
。
- 最接近中位数的是
i = 1
,差距为2
。
总结
- 通过滑动窗口和状态转移公式,代码能够高效地计算每个窗口的结果。
- 时间复杂度为
O(n log n)
(排序) +O(n)
(滑动窗口),适合处理长度为1000
的数组。 - 代码逻辑清晰,易于理解和扩展。
二、JavaScript算法源码
代码详细注释与讲解
以下是代码的逐行注释和逻辑讲解:
1. 输入获取
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});rl.on("line", (line) => {const i = line.lastIndexOf(","); // 找到最后一个逗号的位置const x = line.slice(1, i - 1) // 提取数组部分.split(",") // 分割为字符串数组.map(Number); // 转换为数字数组const k = parseInt(line.slice(i + 1)); // 提取K的值console.log(getResult(x, k)); // 调用核心逻辑并输出结果
});
- 功能:从控制台读取输入并解析为数组
x
和整数k
。 - 关键点:
line.lastIndexOf(",")
:找到最后一个逗号的位置,用于分割数组和k
。line.slice(1, i - 1)
:提取数组部分,去除开头的[
和结尾的]
。split(",")
:将数组部分分割为字符串数组。map(Number)
:将字符串数组转换为数字数组。parseInt(line.slice(i + 1))
:提取k
的值。
2. 核心逻辑
function getResult(x, k) {const n = x.length; // 数组长度const midIdx = Math.floor(n / 2); // 中位数的索引// x数组的中位数const mid = [...x].sort((a, b) => a - b)[midIdx];// 初始化滑窗0~k-1, window为滑窗内部元素的表达式计算结果let window = x[0];for (let i = 1; i < k; i++) {window -= x[i];}// window和中位数的差距let minDiff = Math.abs(mid - window);// window滑窗起始索引let idx = 0;// 滑窗右移for (let i = 1; i <= n - k; i++) {// 右移一格后,新滑窗的表达式计算结果window += -x[i - 1] + 2 * x[i] - x[i + k - 1];// 新滑窗window值和中位数的差距const diff = Math.abs(mid - window);// 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 iif (diff <= minDiff) {minDiff = diff;idx = i;}}return idx;
}
- 功能:找到使表达式结果最接近于中位数的下标
i
。 - 关键点:
- 中位数计算:
[...x].sort((a, b) => a - b)[midIdx]
:将数组排序后取中位数。
- 窗口初始化:
- 计算第一个窗口的结果
window = x[0] - x[1] - ... - x[k - 1]
。
- 计算第一个窗口的结果
- 滑动窗口:
- 使用状态转移公式更新窗口结果:
window += -x[i - 1] + 2 * x[i] - x[i + k - 1]
- 计算当前窗口结果与中位数的差距。
- 更新最小差距和结果下标。
- 使用状态转移公式更新窗口结果:
- 结果选择:
- 如果当前差距小于等于最小差距,则更新最小差距和结果下标。
- 如果差距相等,则选择更大的下标
i
。
- 中位数计算:
代码逻辑总结
-
输入处理:
- 从控制台读取输入并解析为数组
x
和整数k
。
- 从控制台读取输入并解析为数组
-
中位数计算:
- 将数组排序后取中位数。
-
窗口初始化:
- 计算第一个窗口的结果。
-
滑动窗口:
- 使用状态转移公式更新窗口结果。
- 计算当前窗口结果与中位数的差距。
- 更新最小差距和结果下标。
-
结果输出:
- 返回最接近中位数的下标
i
。
- 返回最接近中位数的下标
示例运行
输入:
[50,50,2,3],2
输出:
1
解释:
- 中位数为
50
。 - 窗口计算结果:
i = 0
:50 - 50 = 0
,差距为|0 - 50| = 50
。i = 1
:50 - 2 = 48
,差距为|48 - 50| = 2
。i = 2
:2 - 3 = -1
,差距为|-1 - 50| = 51
。
- 最接近中位数的是
i = 1
,差距为2
。
总结
- 通过滑动窗口和状态转移公式,代码能够高效地计算每个窗口的结果。
- 时间复杂度为
O(n log n)
(排序) +O(n)
(滑动窗口),适合处理长度为1000
的数组。 - 代码逻辑清晰,易于理解和扩展。
三、Java算法源码
代码详细注释与讲解
以下是代码的逐行注释和逻辑讲解:
1. 输入获取
Scanner sc = new Scanner(System.in); // 创建 Scanner 对象,用于从控制台读取输入String line = sc.nextLine(); // 读取一行输入int i = line.lastIndexOf(","); // 找到最后一个逗号的位置int[] x = Arrays.stream(line.substring(1, i - 1).split(",")) // 提取数组部分并分割为字符串数组.mapToInt(Integer::parseInt) // 将字符串数组转换为整数数组.toArray();
int k = Integer.parseInt(line.substring(i + 1)); // 提取 K 的值System.out.println(getResult(x, k)); // 调用核心逻辑并输出结果
- 功能:从控制台读取输入并解析为数组
x
和整数k
。 - 关键点:
line.lastIndexOf(",")
:找到最后一个逗号的位置,用于分割数组和k
。line.substring(1, i - 1)
:提取数组部分,去除开头的[
和结尾的]
。split(",")
:将数组部分分割为字符串数组。mapToInt(Integer::parseInt)
:将字符串数组转换为整数数组。Integer.parseInt(line.substring(i + 1))
:提取k
的值。
2. 核心逻辑
public static int getResult(int[] x, int k) {int n = x.length; // 数组长度// x数组的中位数int mid = Arrays.stream(x).sorted().toArray()[n / 2];// 初始化滑窗0~k-1, window为滑窗内部元素的表达式计算结果int window = x[0];for (int i = 1; i < k; i++) {window -= x[i];}// window和中位数的差距int minDiff = Math.abs(mid - window);// window滑窗起始索引int idx = 0;// 滑窗右移for (int i = 1; i <= n - k; i++) {// 右移一格后,新滑窗的表达式计算结果window += -x[i - 1] + 2 * x[i] - x[i + k - 1];// 新滑窗window值和中位数的差距int diff = Math.abs(mid - window);// 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 iif (diff <= minDiff) {minDiff = diff;idx = i;}}return idx;
}
- 功能:找到使表达式结果最接近于中位数的下标
i
。 - 关键点:
- 中位数计算:
Arrays.stream(x).sorted().toArray()[n / 2]
:将数组排序后取中位数。
- 窗口初始化:
- 计算第一个窗口的结果
window = x[0] - x[1] - ... - x[k - 1]
。
- 计算第一个窗口的结果
- 滑动窗口:
- 使用状态转移公式更新窗口结果:
window += -x[i - 1] + 2 * x[i] - x[i + k - 1]
- 计算当前窗口结果与中位数的差距。
- 更新最小差距和结果下标。
- 使用状态转移公式更新窗口结果:
- 结果选择:
- 如果当前差距小于等于最小差距,则更新最小差距和结果下标。
- 如果差距相等,则选择更大的下标
i
。
- 中位数计算:
代码逻辑总结
-
输入处理:
- 从控制台读取输入并解析为数组
x
和整数k
。
- 从控制台读取输入并解析为数组
-
中位数计算:
- 将数组排序后取中位数。
-
窗口初始化:
- 计算第一个窗口的结果。
-
滑动窗口:
- 使用状态转移公式更新窗口结果。
- 计算当前窗口结果与中位数的差距。
- 更新最小差距和结果下标。
-
结果输出:
- 返回最接近中位数的下标
i
。
- 返回最接近中位数的下标
示例运行
输入:
[50,50,2,3],2
输出:
1
解释:
- 中位数为
50
。 - 窗口计算结果:
i = 0
:50 - 50 = 0
,差距为|0 - 50| = 50
。i = 1
:50 - 2 = 48
,差距为|48 - 50| = 2
。i = 2
:2 - 3 = -1
,差距为|-1 - 50| = 51
。
- 最接近中位数的是
i = 1
,差距为2
。
总结
- 通过滑动窗口和状态转移公式,代码能够高效地计算每个窗口的结果。
- 时间复杂度为
O(n log n)
(排序) +O(n)
(滑动窗口),适合处理长度为1000
的数组。 - 代码逻辑清晰,易于理解和扩展。
四、Python算法源码
代码详细注释与讲解
以下是代码的逐行注释和逻辑讲解:
1. 输入获取
tmp = input() # 从控制台读取输入i = tmp.rfind(",") # 找到最后一个逗号的位置x = list(map(int, tmp[1:i-1].split(","))) # 提取数组部分并转换为整数列表
k = int(tmp[i+1:]) # 提取 K 的值
- 功能:从控制台读取输入并解析为数组
x
和整数k
。 - 关键点:
tmp.rfind(",")
:找到最后一个逗号的位置,用于分割数组和k
。tmp[1:i-1]
:提取数组部分,去除开头的[
和结尾的]
。split(",")
:将数组部分分割为字符串列表。map(int, ...)
:将字符串列表转换为整数列表。int(tmp[i+1:])
:提取k
的值。
2. 核心逻辑
def getResult():n = len(x) # 数组长度# x数组的中位数mid = sorted(x)[n // 2]# 初始化滑窗0~k-1, window为滑窗内部元素的表达式计算结果window = x[0]for j in range(1, k):window -= x[j]# window和中位数的差距minDiff = abs(mid - window)# window滑窗起始索引idx = 0# 滑窗右移for i in range(1, n-k+1):# 右移一格后,新滑窗的表达式计算结果window += -x[i-1] + 2 * x[i] - x[i + k -1]# 新滑窗window值和中位数的差距diff = abs(mid - window)# 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 iif diff <= minDiff:minDiff = diffidx = ireturn idx
- 功能:找到使表达式结果最接近于中位数的下标
i
。 - 关键点:
- 中位数计算:
sorted(x)[n // 2]
:将数组排序后取中位数。
- 窗口初始化:
- 计算第一个窗口的结果
window = x[0] - x[1] - ... - x[k - 1]
。
- 计算第一个窗口的结果
- 滑动窗口:
- 使用状态转移公式更新窗口结果:
window += -x[i-1] + 2 * x[i] - x[i + k -1]
- 计算当前窗口结果与中位数的差距。
- 更新最小差距和结果下标。
- 使用状态转移公式更新窗口结果:
- 结果选择:
- 如果当前差距小于等于最小差距,则更新最小差距和结果下标。
- 如果差距相等,则选择更大的下标
i
。
- 中位数计算:
3. 算法调用
print(getResult()) # 调用核心逻辑并输出结果
- 功能:调用
getResult
方法并输出结果。
代码逻辑总结
-
输入处理:
- 从控制台读取输入并解析为数组
x
和整数k
。
- 从控制台读取输入并解析为数组
-
中位数计算:
- 将数组排序后取中位数。
-
窗口初始化:
- 计算第一个窗口的结果。
-
滑动窗口:
- 使用状态转移公式更新窗口结果。
- 计算当前窗口结果与中位数的差距。
- 更新最小差距和结果下标。
-
结果输出:
- 返回最接近中位数的下标
i
。
- 返回最接近中位数的下标
示例运行
输入:
[50,50,2,3],2
输出:
1
解释:
- 中位数为
50
。 - 窗口计算结果:
i = 0
:50 - 50 = 0
,差距为|0 - 50| = 50
。i = 1
:50 - 2 = 48
,差距为|48 - 50| = 2
。i = 2
:2 - 3 = -1
,差距为|-1 - 50| = 51
。
- 最接近中位数的是
i = 1
,差距为2
。
总结
- 通过滑动窗口和状态转移公式,代码能够高效地计算每个窗口的结果。
- 时间复杂度为
O(n log n)
(排序) +O(n)
(滑动窗口),适合处理长度为1000
的数组。 - 代码逻辑清晰,易于理解和扩展。
五、C/C++算法源码:
以下是代码的 C++ 和 C 语言实现,并附带详细的中文注释和讲解。
C++ 实现
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>using namespace std;// 核心逻辑函数
int getResult(const vector<int>& x, int k) {int n = x.size();// 复制数组并排序,用于计算中位数vector<int> x_cp(x);sort(x_cp.begin(), x_cp.end());// 计算中位数int mid = x_cp[n / 2];// 初始化滑窗 0~k-1,window 为滑窗内部元素的表达式计算结果int window = x[0];for (int i = 1; i < k; i++) {window -= x[i];}// window 和中位数的差距int minDiff = abs(mid - window);// window 滑窗起始索引int idx = 0;// 滑窗右移for (int i = 1; i <= n - k; i++) {// 右移一格后,新滑窗的表达式计算结果window += -x[i - 1] + 2 * x[i] - x[i + k - 1];// 新滑窗 window 值和中位数的差距int diff = abs(mid - window);// 结果最接近于数组中位数的下标 i,如果有多个 i 满足条件,返回最大的 iif (diff <= minDiff) {minDiff = diff;idx = i;}}return idx;
}int main() {string s;cin >> s; // 读取输入字符串// 找到最后一个逗号的位置size_t lastComma = s.rfind(',');// 提取数组部分string arrStr = s.substr(1, lastComma - 2); // 去掉开头的 '[' 和结尾的 ']'// 提取 k 的值int k = stoi(s.substr(lastComma + 1));// 将数组部分分割为整数vector<int> x;size_t pos = 0;while ((pos = arrStr.find(',')) != string::npos) {x.push_back(stoi(arrStr.substr(0, pos)));arrStr.erase(0, pos + 1);}x.push_back(stoi(arrStr)); // 添加最后一个元素// 调用核心逻辑并输出结果cout << getResult(x, k) << endl;return 0;
}
C 语言实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>#define MAX_SIZE 1000// 比较函数,用于 qsort
int cmp(const void *a, const void *b) {return (*(int *)a) - (*(int *)b);
}// 核心逻辑函数
int getResult(const int x[], int n, int k) {int x_cp[n];for (int i = 0; i < n; i++) {x_cp[i] = x[i]; // 复制数组}// 排序数组,用于计算中位数qsort(x_cp, n, sizeof(int), cmp);// 计算中位数int mid = x_cp[n / 2];// 初始化滑窗 0~k-1,window 为滑窗内部元素的表达式计算结果int window = x[0];for (int i = 1; i < k; i++) {window -= x[i];}// window 和中位数的差距int minDiff = abs(mid - window);// window 滑窗起始索引int idx = 0;// 滑窗右移for (int i = 1; i <= n - k; i++) {// 右移一格后,新滑窗的表达式计算结果window += -x[i - 1] + 2 * x[i] - x[i + k - 1];// 新滑窗 window 值和中位数的差距int diff = abs(mid - window);// 结果最接近于数组中位数的下标 i,如果有多个 i 满足条件,返回最大的 iif (diff <= minDiff) {minDiff = diff;idx = i;}}return idx;
}int main() {char s[100000];scanf("%s", s); // 读取输入字符串// 找到最后一个逗号的位置char *p = strrchr(s, ',');*p = '\0'; // 将逗号替换为字符串结束符// 提取数组部分int nums[MAX_SIZE];int nums_size = 0;char *token = strtok(s + 1, ","); // 跳过开头的 '['while (token != NULL) {nums[nums_size++] = atoi(token); // 将字符串转换为整数token = strtok(NULL, ",");}// 提取 k 的值int k = atoi(p + 1);// 调用核心逻辑并输出结果printf("%d\n", getResult(nums, nums_size, k));return 0;
}
代码详细注释与讲解
1. 输入处理
- C++:
- 使用
cin
读取输入字符串。 - 使用
substr
和find
提取数组部分和k
的值。 - 将数组部分分割为整数并存入
vector<int>
。
- 使用
- C:
- 使用
scanf
读取输入字符串。 - 使用
strrchr
找到最后一个逗号的位置,并分割字符串。 - 使用
strtok
将数组部分分割为整数并存入数组。
- 使用
2. 核心逻辑
- 中位数计算:
- 复制原数组并排序,取排序后数组的中间值作为中位数。
- 滑动窗口初始化:
- 计算第一个窗口的结果
window = x[0] - x[1] - ... - x[k - 1]
。
- 计算第一个窗口的结果
- 滑动窗口右移:
- 使用状态转移公式更新窗口结果:
window += -x[i - 1] + 2 * x[i] - x[i + k - 1]
- 计算当前窗口结果与中位数的差距。
- 更新最小差距和结果下标。
- 使用状态转移公式更新窗口结果:
- 结果选择:
- 如果当前差距小于等于最小差距,则更新最小差距和结果下标。
- 如果差距相等,则选择更大的下标
i
。
3. 输出结果
- C++:使用
cout
输出结果。 - C:使用
printf
输出结果。
示例运行
输入:
[50,50,2,3],2
输出:
1
解释:
- 中位数为
50
。 - 窗口计算结果:
i = 0
:50 - 50 = 0
,差距为|0 - 50| = 50
。i = 1
:50 - 2 = 48
,差距为|48 - 50| = 2
。i = 2
:2 - 3 = -1
,差距为|-1 - 50| = 51
。
- 最接近中位数的是
i = 1
,差距为2
。
总结
- C++ 和 C 的实现逻辑一致,主要区别在于输入处理和数据结构的使用。
- C++ 使用
vector
和string
简化了数组和字符串的操作。 - C 使用数组和指针手动处理字符串分割和数组操作。
- 代码通过滑动窗口和状态转移公式高效地计算每个窗口的结果,时间复杂度为
O(n log n)
(排序) +O(n)
(滑动窗口)。
六、尾言
什么是华为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++)
一、问题描述 题目解析 我们需要找到一个下标 i,使得表达式 X[i] - X[i 1] - ... - X[i K - 1] 的结果最接近于数组的中位数。如果有多个 i 满足条件,则返回最大的 i。 关键点: 中位数计算: 将数组排序后,中位数…...
Pytorch 自学笔记(三):利用自定义文本数据集构建Dataset和DataLoader
Pytorch 自学笔记(三) 1. Dataset与DataLoader1.1 torch.utils.data.Dataset1.2 torch.utils.data.DataLoader Pytorch 自学笔记系列的第三篇。针对Pytorch的Dataset和DataLoader进行简单的介绍,同时,介绍如何使用自定义文本数据集…...

QT 使用QSqlTableModel对数据库进行创建,插入,显示
文章目录 效果图概述功能点代码分析初始数据插入数据数据显示 总结 效果图 概述 本案例用于对数据库中的数据进行显示等其他操作,其他表格筛选,过滤等功能可看此博客 框架:数据模型使用QSqlTableModel,视图使用QTableView&#x…...
如何学习Transformer架构
Transformer架构自提出以来,在自然语言处理领域引发了革命性的变化。作为一种基于注意力机制的模型,Transformer解决了传统序列模型在并行化和长距离依赖方面的局限性。本文将探讨Transformer论文《Attention is All You Need》与Hugging Face Transform…...

浅谈云计算22 | Kubernetes容器编排引擎
Kubernetes容器编排引擎 一、Kubernetes管理对象1.1 Kubernetes组件和架构1.2 主要管理对象类型 二、Kubernetes 服务2.1 服务的作用与原理2.2 服务类型 三、Kubernetes网络管理3.1 网络模型与目标3.2 网络组件3.2.1 kube-proxy3.2.2 网络插件 3.3 网络通信流程 四、Kubernetes…...
计算 SAMOut V3 在将词汇表从1万 增加到6千万的情况下能够减少多少参数
当我们将词汇表从 60,000,000(六千万)减少到 10,000 时,实际上是在缩小模型的词嵌入层及其共享的语言模型头(LM Head)的规模。这将导致参数量显著减少。我们可以通过以下步骤来计算具体的参数减少量。 参数量减少计算…...
03.选择排序
一、题目思路 选择排序是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大ÿ…...

02_登录窗口
新建场景 重命名为GameRoot 双击GameRoot进入新场景 同样摄像机清除格式 删除平行光并关闭渲染灯光的天空盒 新建空节点重命名为GameRoot GameRoot为游戏的根节点 在整个游戏中都不会被删除 在游戏的根节点下创建UI的根节点Canvas 创建一个空节点 作为UI根节点下的 登录场景UI…...

NodeJS | 搭建本地/公网服务器 live-server 的使用与安装
目录 介绍 安装 live-server 安装方法 安装后的验证 环境变量问题 Node.js 环境变量未配置正确 全局安装的 live-server 路径未添加到环境变量 运行测试 默认访问主界面 访问文件 报错信息与解决 问题一:未知命令 问题二:拒绝脚本 公网配置…...

SystemUI 实现音量条同步功能
需求:SystemUI 实现音量条同步功能 具体问题 以前在SystemUI 下拉框添加了音量条控制,目前发现在SystemUI下拉框显示状态的情况下, 按键或者底部虚拟导航点击音量加减时候,SystemUI音量条不更新。 如下图:两个Syste…...

嵌入式知识点总结 C/C++ 专题提升(一)-关键字
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.C语言宏中"#“和"##"的用法 1.1.(#)字符串化操作符 1.2.(##)符号连接操作符 2.关键字volatile有什么含意?并举出三个不同的例子? 2.1.并行设备的硬件寄存…...

基础入门-传输加密数据格式编码算法密文存储代码混淆逆向保护安全影响
知识点: 1、传输格式&传输数据-类型&编码&算法 2、密码存储&代码混淆-不可逆&非对称性 一、演示案例-传输格式&传输数据-类型&编码&算法 传输格式 JSON XML WebSockets HTML 二进制 自定义 WebSockets:聊天交互较常…...

几个Linux系统安装体验(续): 统信桌面系统
本文介绍统信桌面系统(uos)的安装。 下载 下载地址: https://www.chinauos.com/resource/download-professional 下载文件:本文下载文件名称为uos-desktop-20-professional-1070-amd64.iso。 下载注意事项:可直接下…...

算法日记6.StarryCoding P52:我们都需要0(异或)
一、题目 二、题解: 1、对于这道题,题意为让我们寻找一个数x使得 b[i]a[i]^x, 并且b[1]^b[2]^b[3]^ b[4]^b[5]....0 2、我们把b[i]给拆开,可以得到 3、又因为^满足结合律,因此,可以把括号给拆开 4、接着…...

【网络协议】RFC3164-The BSD syslog Protocol
引言 Syslog常被称为系统日志或系统记录,是一种标准化的协议,用于网络设备、服务器和应用程序向中央Syslog服务器发送日志消息。互联网工程任务组(IETF)发布的RFC 3164,专门定义了BSD Syslog协议的规范和实现方式。通…...

SpringCloud -根据服务名获取服务运行实例并进行负载均衡
Nacos注册中心 每个服务启动之后都要向注册中心发送服务注册请求,注册中心可以和各个注册客户端自定义协议实现服务注册和发现。 pom.xml <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-na…...
CentOS 安装Redis
1. 安装 Redis 安装 EPEL 仓库(对于 CentOS/RHEL 系统): 首先安装 EPEL 仓库,因为 Redis 存在于 EPEL 仓库中: yum install epel-release安装 Redis 数据库: yum install redis2. 修改 Redis 配置文件 …...
Linux网络 TCP socket
TCP简介 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它位于OSI模型的第四层,主要为应用层提供数据传输服务。TCP通过三次握手建立连接,确保数据在发送和接收过程中的准确性和顺序…...

(一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)
一、四大坐标系介绍 1,世界坐标系 从这个世界(world)的视角来看物体 世界坐标系是3D空间坐标,每个点的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw,Yw,Zw)表示 2,相机坐标系 相机本身具有一个坐标系&…...

【Linux网络编程】高效I/O--I/O的五种类型
目录 I/O的概念 网络通信的本质 I/O的本质 高效I/O 五种I/O模型 阻塞I/O 非阻塞I/O 信号驱动I/O 多路转接/多路复用I/O 异步I/O 非阻塞I/O的实现 I/O的概念 网络通信的本质 网络通信的本质其实就是I/O I:表示input(输入)O:表示ou…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...