【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], 2
input_str = input().strip() # 读取输入
x_str, k_str = input_str.split('],') # 分割数组和K
x = list(map(int, x_str[1:].split(','))) # 解析数组
k = int(k_str) # 解析K
return 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 = diff
result = i
return 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('],') # 分割数组和K
x = list(map(int, x_str[1:].split(','))) # 解析数组
k = int(k_str) # 解析K
return 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 = diff
result = i
return 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 满足条件,请返回最大的 i
if (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 满足条件,请返回最大的 i
if (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 满足条件,请返回最大的 i
if diff <= minDiff:
minDiff = diff
idx = i
return 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 满足条件,返回最大的 i
if (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 满足条件,返回最大的 i
if (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 或监考人员进行反馈。
祝你考试顺利,取得理想成绩!