【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…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...