【2024年华为OD机试】 (B卷,100分)- 路灯照明问题(Java JS PythonC/C++)
一、问题描述
路灯照明问题
题目描述
在一条笔直的公路上安装了 ( N ) 个路灯,从位置 0 开始安装,路灯之间间距固定为 100 米。每个路灯都有自己的照明半径。请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。
输入描述
- 第一行为一个数 ( N ),表示路灯个数,( 1 \leq N \leq 100000 )。
- 第二行为 ( N ) 个空格分隔的数,表示路灯的照明半径,( 1 \leq \text{照明半径} \leq 100000 \times 100 )。
输出描述
第一个路灯和最后一个路灯之间,无法照明的区间的长度和。
用例
输入 1
2
50 50
输出 1
0
说明 1
- 路灯 1 覆盖范围:( [0, 50] )。
- 路灯 2 覆盖范围:( [50, 100] )。
- 路灯 1 和路灯 2 之间(0 米 - 100 米)无未覆盖的区间。
输入 2
4
50 70 20 70
输出 2
20
说明 2
- 路灯 1 覆盖范围:( [0, 50] )。
- 路灯 2 覆盖范围:( [30, 170] )。
- 路灯 3 覆盖范围:( [180, 220] )。
- 路灯 4 覆盖范围:( [230, 370] )。
- 未覆盖的区间:( [170, 180] ) 和 ( [220, 230] ),总长度为 20 米。
题目解析
问题分析
-
路灯位置:
- 路灯的位置是固定的,第 ( i ) 个路灯的位置为 ( i \times 100 ) 米。
-
照明范围:
- 每个路灯的照明范围是一个区间,中心为路灯的位置,半径为照明半径。
- 假设第 ( i ) 个路灯的位置为 ( \text{center} = i \times 100 ),照明半径为 ( r ),则照明范围为 ( [\text{center} - r, \text{center} + r] )。
-
问题转化:
- 将所有路灯的照明范围区间合并,得到一组连续的照明区间。
- 计算这些合并后的区间之间的间隙长度之和,即为无法照明的区间长度和。
解决思路
-
区间表示:
- 对于每个路灯,计算其照明范围区间 ( [\text{center} - r, \text{center} + r] )。
-
区间排序:
- 将所有区间按照起始位置升序排序。
- 如果起始位置相同,则按照结束位置降序排序。
-
区间合并:
- 遍历排序后的区间,依次合并有交集的区间。
- 合并后的区间为 ( [\text{start}, \text{end}] ),其中:
- ( \text{start} ) 为当前区间的起始位置。
- ( \text{end} ) 为当前区间的结束位置。
-
计算间隙:
- 遍历合并后的区间,计算相邻区间之间的间隙长度。
- 将所有间隙长度累加,得到无法照明的区间长度和。
关键点
-
区间排序:
- 按照起始位置升序排序,确保区间按顺序处理。
- 如果起始位置相同,按照结束位置降序排序,简化合并逻辑。
-
区间合并:
- 判断当前区间与前一个合并后的区间是否有交集。
- 如果有交集,则更新合并后的区间的结束位置。
-
间隙计算:
- 遍历合并后的区间,计算相邻区间的间隙长度。
- 间隙长度为后一个区间的起始位置减去前一个区间的结束位置。
示例解析
输入 1
2
50 50
- 路灯 1 的照明范围:( [0 - 50, 0 + 50] = [0, 50] )。
- 路灯 2 的照明范围:( [100 - 50, 100 + 50] = [50, 150] )。
- 合并后的区间:( [0, 150] )。
- 无法照明的区间长度和:( 0 )。
输入 2
4
50 70 20 70
- 路灯 1 的照明范围:( [0 - 50, 0 + 50] = [0, 50] )。
- 路灯 2 的照明范围:( [100 - 70, 100 + 70] = [30, 170] )。
- 路灯 3 的照明范围:( [200 - 20, 200 + 20] = [180, 220] )。
- 路灯 4 的照明范围:( [300 - 70, 300 + 70] = [230, 370] )。
- 合并后的区间:( [0, 170] )、( [180, 220] )、( [230, 370] )。
- 无法照明的区间:( [170, 180] ) 和 ( [220, 230] ),总长度为 20 米。
通过以上分析,可以清晰地理解题目的要求和解题思路。
二、JavaScript算法源码
以下是您提供的 JavaScript 代码的详细解析和注释,帮助您更好地理解代码的逻辑和实现。
代码解析
1. 输入获取
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
rl.on("line", (line) => {lines.push(line);if (lines.length === 2) {const n = lines[0] - 0;const arr = lines[1].split(" ").map(Number);console.log(getResult(n, arr));lines.length = 0;}
});
- 功能:
- 使用 Node.js 的
readline
模块创建一个接口,用于从标准输入读取数据。 - 将输入的行数据存储到
lines
数组中。 - 当输入的行数达到 2 行时,解析输入数据并调用
getResult
函数计算结果。 - 输出结果后,清空
lines
数组,以便处理下一组输入。
- 使用 Node.js 的
2. 算法实现
function getResult(n, arr) {const ranges = []; // 存储所有路灯的照明范围区间// 计算每个路灯的照明范围for (let i = 0; i < n; i++) {const center = i * 100; // 路灯的位置ranges.push([center - arr[i], center + arr[i]]); // 照明范围区间 [start, end]}// 按起始位置升序排序,起始位置相同则按结束位置降序排序ranges.sort((a, b) => (a[0] != b[0] ? a[0] - b[0] : b[1] - a[1]));let ans = 0; // 无法照明的区间长度和let t = ranges[0][1]; // 上一个区间的结束位置for (let i = 1; i < n; i++) {const [s, e] = ranges[i]; // 当前区间的【开始位置,结束位置】// 有交集if (t >= s) {// 合并后的新区间将变为下一轮的上一个区间,t 为新区间的结束位置t = Math.max(e, t);} else {// 没有交集,则统计区间间隙 s - tans += s - t;// 当前区间变为下一轮的上一个区间,更新 tt = e;}}return ans;
}
- 功能:
- 计算每个路灯的照明范围区间,并存储到
ranges
数组中。 - 对
ranges
数组进行排序:- 按起始位置升序排序。
- 如果起始位置相同,则按结束位置降序排序。
- 遍历排序后的区间,合并有交集的区间,并计算无法照明的区间长度和。
- 返回无法照明的区间长度和。
- 计算每个路灯的照明范围区间,并存储到
代码逻辑总结
-
输入处理:
- 读取路灯数量 ( n )。
- 读取每个路灯的照明半径,并存储到
arr
数组中。
-
照明范围计算:
- 对于每个路灯,计算其照明范围区间 ( [\text{center} - r, \text{center} + r] ),其中 ( \text{center} = i \times 100 )。
-
区间排序:
- 将所有照明范围区间按起始位置升序排序。
- 如果起始位置相同,则按结束位置降序排序。
-
区间合并与间隙计算:
- 遍历排序后的区间,合并有交集的区间。
- 计算相邻区间之间的间隙长度,并累加到
ans
中。
-
输出结果:
- 返回无法照明的区间长度和。
示例运行
输入 1
2
50 50
输出 1
0
说明 1
- 路灯 1 的照明范围:( [0 - 50, 0 + 50] = [0, 50] )。
- 路灯 2 的照明范围:( [100 - 50, 100 + 50] = [50, 150] )。
- 合并后的区间:( [0, 150] )。
- 无法照明的区间长度和:( 0 )。
输入 2
4
50 70 20 70
输出 2
20
说明 2
- 路灯 1 的照明范围:( [0 - 50, 0 + 50] = [0, 50] )。
- 路灯 2 的照明范围:( [100 - 70, 100 + 70] = [30, 170] )。
- 路灯 3 的照明范围:( [200 - 20, 200 + 20] = [180, 220] )。
- 路灯 4 的照明范围:( [300 - 70, 300 + 70] = [230, 370] )。
- 合并后的区间:( [0, 170] )、( [180, 220] )、( [230, 370] )。
- 无法照明的区间:( [170, 180] ) 和 ( [220, 230] ),总长度为 20 米。
代码详细注释
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
rl.on("line", (line) => {lines.push(line);if (lines.length === 2) {const n = lines[0] - 0; // 读取路灯数量const arr = lines[1].split(" ").map(Number); // 读取照明半径并转换为数字数组console.log(getResult(n, arr)); // 调用算法并输出结果lines.length = 0; // 清空输入缓存}
});function getResult(n, arr) {const ranges = []; // 存储所有路灯的照明范围区间// 计算每个路灯的照明范围for (let i = 0; i < n; i++) {const center = i * 100; // 路灯的位置ranges.push([center - arr[i], center + arr[i]]); // 照明范围区间 [start, end]}// 按起始位置升序排序,起始位置相同则按结束位置降序排序ranges.sort((a, b) => (a[0] != b[0] ? a[0] - b[0] : b[1] - a[1]));let ans = 0; // 无法照明的区间长度和let t = ranges[0][1]; // 上一个区间的结束位置for (let i = 1; i < n; i++) {const [s, e] = ranges[i]; // 当前区间的【开始位置,结束位置】// 有交集if (t >= s) {// 合并后的新区间将变为下一轮的上一个区间,t 为新区间的结束位置t = Math.max(e, t);} else {// 没有交集,则统计区间间隙 s - tans += s - t;// 当前区间变为下一轮的上一个区间,更新 tt = e;}}return ans; // 返回无法照明的区间长度和
}
希望这段代码和注释对您有帮助!如果有其他问题,欢迎随时提问!
三、Java算法源码
这段Java代码的主要功能是处理一组区间(ranges),计算这些区间之间的间隙总和。下面是对代码的详细注释和讲解:
1. 导入必要的类
import java.util.Arrays;
import java.util.Scanner;
Arrays
类用于数组操作,比如排序。Scanner
类用于从标准输入读取数据。
2. 主类 Main
public class Main {public static void main(String[] args) {// 创建一个Scanner对象,用于读取输入Scanner sc = new Scanner(System.in);// 读取区间的数量nint n = sc.nextInt();// 创建一个二维数组ranges,用于存储每个区间的起始和结束位置int[][] ranges = new int[n][2];// 循环读取每个区间的半径,并计算区间的起始和结束位置for (int i = 0; i < n; i++) {int center = i * 100; // 区间的中心位置int r = sc.nextInt(); // 读取区间的半径ranges[i][0] = center - r; // 区间的起始位置ranges[i][1] = center + r; // 区间的结束位置}// 调用getResult方法计算区间间隙总和,并输出结果System.out.println(getResult(n, ranges));}
main
方法是程序的入口。Scanner
对象sc
用于从标准输入读取数据。n
是区间的数量。ranges
是一个二维数组,存储每个区间的起始和结束位置。- 通过循环读取每个区间的半径,并计算区间的起始和结束位置。
3. getResult
方法
public static int getResult(int n, int[][] ranges) {int ans = 0; // 初始化间隙总和为0// 按起始位置升序排序,如果起始位置相同,则按结束位置降序排序Arrays.sort(ranges, (a, b) -> a[0] != b[0] ? a[0] - b[0] : b[1] - a[1]);// 初始化上一个区间的结束位置为第一个区间的结束位置int t = ranges[0][1];// 遍历剩余的区间for (int i = 1; i < n; i++) {// 当前区间的【开始位置,结束位置】int s = ranges[i][0];int e = ranges[i][1];// 如果当前区间与上一个区间有交集if (t >= s) {// 合并区间,更新t为当前区间和上一个区间的最大结束位置t = Math.max(e, t);} else {// 如果没有交集,则计算间隙并累加到ansans += s - t;// 更新t为当前区间的结束位置t = e;}}// 返回区间间隙总和return ans;}
}
ans
用于存储区间间隙的总和。Arrays.sort
对区间进行排序,首先按起始位置升序排序,如果起始位置相同,则按结束位置降序排序。t
用于记录上一个区间的结束位置。- 遍历剩余的区间,检查当前区间与上一个区间是否有交集:
- 如果有交集,则合并区间,更新
t
为当前区间和上一个区间的最大结束位置。 - 如果没有交集,则计算间隙并累加到
ans
,然后更新t
为当前区间的结束位置。
- 如果有交集,则合并区间,更新
- 最后返回区间间隙总和
ans
。
4. 代码逻辑总结
- 该代码首先读取一组区间的半径,并计算每个区间的起始和结束位置。
- 然后对这些区间进行排序,确保它们按起始位置升序排列。
- 接着遍历这些区间,计算它们之间的间隙总和。
- 最终输出区间间隙的总和。
5. 代码执行流程
- 读取输入的区间数量
n
。 - 读取每个区间的半径,并计算区间的起始和结束位置。
- 对区间进行排序。
- 遍历区间,计算间隙总和。
- 输出结果。
6. 代码的适用场景
- 该代码适用于需要计算一组区间之间间隙总和的场景,例如在时间调度、资源分配等领域中,计算时间或资源的空闲时间。
四、Python算法源码
这段Python代码的功能与之前的Java代码类似,也是处理一组区间并计算它们之间的间隙总和。以下是代码的详细注释和讲解:
1. 输入获取
n = int(input())
arr = list(map(int, input().split()))
n
是区间的数量。arr
是一个列表,存储每个区间的半径。
2. 算法入口 getResult
def getResult():rans = [] # 用于存储每个区间的起始和结束位置
rans
是一个列表,用于存储每个区间的起始和结束位置。
3. 计算每个区间的起始和结束位置
for i in range(n):center = i * 100 # 区间的中心位置rans.append([center - arr[i], center + arr[i]]) # 计算区间的起始和结束位置
- 对于每个区间,计算其中心位置
center = i * 100
。 - 根据半径
arr[i]
,计算区间的起始位置center - arr[i]
和结束位置center + arr[i]
,并将其添加到rans
列表中。
4. 对区间进行排序
# 按起始位置升序,起始位置相同,则继续按结束位置降序rans.sort(key=lambda ran: (ran[0], -ran[1]))
- 使用
sort
方法对区间进行排序:- 首先按起始位置升序排序。
- 如果起始位置相同,则按结束位置降序排序。
5. 初始化变量
ans = 0 # 用于存储区间间隙的总和t = rans[0][1] # 上一个区间的结束位置
ans
用于存储区间间隙的总和,初始值为 0。t
用于记录上一个区间的结束位置,初始值为第一个区间的结束位置。
6. 遍历区间并计算间隙
for i in range(1, n):s, e = rans[i] # 当前区间的【开始位置,结束位置】# 有交集if t >= s:# 合并后的新区间将变为下一轮的上一个区间,t为新区间的结束位置t = max(e, t)else:# 没有交集,则统计区间间隙 s - tans += s - t# 当前区间变为下一轮的上一个区间,更新tt = e
- 遍历剩余的区间:
s
是当前区间的起始位置,e
是当前区间的结束位置。- 如果当前区间与上一个区间有交集(即
t >= s
),则合并区间,更新t
为当前区间和上一个区间的最大结束位置。 - 如果没有交集,则计算间隙
s - t
并累加到ans
,然后更新t
为当前区间的结束位置。
7. 返回结果
return ans
- 返回区间间隙的总和
ans
。
8. 算法调用
print(getResult())
- 调用
getResult
函数并输出结果。
9. 代码逻辑总结
- 输入获取:
- 读取区间的数量
n
和每个区间的半径arr
。
- 读取区间的数量
- 区间计算:
- 根据半径计算每个区间的起始和结束位置,并存储在
rans
列表中。
- 根据半径计算每个区间的起始和结束位置,并存储在
- 区间排序:
- 对区间按起始位置升序排序,起始位置相同时按结束位置降序排序。
- 间隙计算:
- 遍历区间,计算区间之间的间隙总和。
- 输出结果:
- 返回并输出区间间隙的总和。
10. 代码执行流程
- 读取输入的区间数量
n
和半径列表arr
。 - 计算每个区间的起始和结束位置。
- 对区间进行排序。
- 遍历区间,计算间隙总和。
- 输出结果。
11. 代码的适用场景
- 该代码适用于需要计算一组区间之间间隙总和的场景,例如:
- 时间调度中的空闲时间计算。
- 资源分配中的空闲资源计算。
- 区间覆盖问题的间隙分析。
12. 示例运行
输入:
3
20 30 10
计算过程:
- 计算区间:
- 区间 0:
[0 - 20, 0 + 20] = [-20, 20]
- 区间 1:
[100 - 30, 100 + 30] = [70, 130]
- 区间 2:
[200 - 10, 200 + 10] = [190, 210]
- 区间 0:
- 排序区间:
- 排序后:
[[-20, 20], [70, 130], [190, 210]]
- 排序后:
- 计算间隙:
- 区间 0 和区间 1 之间的间隙:
70 - 20 = 50
- 区间 1 和区间 2 之间的间隙:
190 - 130 = 60
- 总间隙:
50 + 60 = 110
- 区间 0 和区间 1 之间的间隙:
输出:
110
五、C/C++算法源码:
以下是 C语言 和 C++ 版本的代码,并附带详细的中文注释和讲解。
C语言代码
#include <stdio.h>
#include <stdlib.h>#define MAX(a, b) (a) > (b) ? (a) : (b) // 定义一个宏,用于求两个数的最大值// 函数声明
int getResult(int n, int ranges[][2]); // 计算区间间隙总和的函数
int cmp(const void* a, const void* b); // 用于qsort的比较函数int main() {int n;scanf("%d", &n); // 读取区间的数量int ranges[n][2]; // 定义一个二维数组,存储每个区间的起始和结束位置// 读取每个区间的半径,并计算区间的起始和结束位置for (int i = 0; i < n; i++) {int center = i * 100; // 区间的中心位置int r;scanf("%d", &r); // 读取区间的半径ranges[i][0] = center - r; // 区间的起始位置ranges[i][1] = center + r; // 区间的结束位置}// 调用getResult函数计算区间间隙总和,并输出结果printf("%d\n", getResult(n, ranges));return 0;
}// 计算区间间隙总和的函数
int getResult(int n, int ranges[][2]) {int ans = 0; // 初始化间隙总和为0// 使用qsort对区间进行排序// 排序规则:按起始位置升序,起始位置相同则按结束位置降序qsort(ranges, n, sizeof(int*), cmp);int t = ranges[0][1]; // 初始化上一个区间的结束位置为第一个区间的结束位置// 遍历剩余的区间for (int i = 1; i < n; i++) {int s = ranges[i][0]; // 当前区间的起始位置int e = ranges[i][1]; // 当前区间的结束位置if (t >= s) {// 有交集,合并区间t = MAX(e, t); // 更新t为当前区间和上一个区间的最大结束位置} else {// 没有交集,计算间隙并累加到ansans += s - t;t = e; // 更新t为当前区间的结束位置}}return ans; // 返回区间间隙总和
}// 用于qsort的比较函数
int cmp(const void* a, const void* b) {int* A = (int*)a;int* B = (int*)b;// 按起始位置升序,起始位置相同则按结束位置降序return A[0] != B[0] ? A[0] - B[0] : B[1] - A[1];
}
C语言代码讲解
-
宏定义:
#define MAX(a, b)
:定义一个宏,用于求两个数的最大值。
-
主函数
main
:- 读取区间的数量
n
。 - 定义一个二维数组
ranges
,用于存储每个区间的起始和结束位置。 - 通过循环读取每个区间的半径,并计算区间的起始和结束位置。
- 调用
getResult
函数计算区间间隙总和,并输出结果。
- 读取区间的数量
-
getResult
函数:- 初始化间隙总和
ans
为 0。 - 使用
qsort
对区间进行排序,排序规则为按起始位置升序,起始位置相同则按结束位置降序。 - 初始化
t
为第一个区间的结束位置。 - 遍历剩余的区间,检查当前区间与上一个区间是否有交集:
- 如果有交集,则合并区间,更新
t
为当前区间和上一个区间的最大结束位置。 - 如果没有交集,则计算间隙并累加到
ans
,然后更新t
为当前区间的结束位置。
- 如果有交集,则合并区间,更新
- 返回区间间隙总和
ans
。
- 初始化间隙总和
-
cmp
函数:- 用于
qsort
的比较函数,按起始位置升序,起始位置相同则按结束位置降序。
- 用于
C++代码
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 定义一个宏,用于求两个数的最大值
#define MAX(a, b) (a) > (b) ? (a) : (b)// 计算区间间隙总和的函数
int getResult(int n, vector<vector<int>>& ranges) {int ans = 0; // 初始化间隙总和为0// 使用sort对区间进行排序// 排序规则:按起始位置升序,起始位置相同则按结束位置降序sort(ranges.begin(), ranges.end(), [](const vector<int>& a, const vector<int>& b) {return a[0] != b[0] ? a[0] < b[0] : a[1] > b[1];});int t = ranges[0][1]; // 初始化上一个区间的结束位置为第一个区间的结束位置// 遍历剩余的区间for (int i = 1; i < n; i++) {int s = ranges[i][0]; // 当前区间的起始位置int e = ranges[i][1]; // 当前区间的结束位置if (t >= s) {// 有交集,合并区间t = MAX(e, t); // 更新t为当前区间和上一个区间的最大结束位置} else {// 没有交集,计算间隙并累加到ansans += s - t;t = e; // 更新t为当前区间的结束位置}}return ans; // 返回区间间隙总和
}int main() {int n;cin >> n; // 读取区间的数量vector<vector<int>> ranges(n, vector<int>(2)); // 定义一个二维向量,存储每个区间的起始和结束位置// 读取每个区间的半径,并计算区间的起始和结束位置for (int i = 0; i < n; i++) {int center = i * 100; // 区间的中心位置int r;cin >> r; // 读取区间的半径ranges[i][0] = center - r; // 区间的起始位置ranges[i][1] = center + r; // 区间的结束位置}// 调用getResult函数计算区间间隙总和,并输出结果cout << getResult(n, ranges) << endl;return 0;
}
C++代码讲解
-
宏定义:
#define MAX(a, b)
:定义一个宏,用于求两个数的最大值。
-
主函数
main
:- 读取区间的数量
n
。 - 定义一个二维向量
ranges
,用于存储每个区间的起始和结束位置。 - 通过循环读取每个区间的半径,并计算区间的起始和结束位置。
- 调用
getResult
函数计算区间间隙总和,并输出结果。
- 读取区间的数量
-
getResult
函数:- 初始化间隙总和
ans
为 0。 - 使用
sort
对区间进行排序,排序规则为按起始位置升序,起始位置相同则按结束位置降序。 - 初始化
t
为第一个区间的结束位置。 - 遍历剩余的区间,检查当前区间与上一个区间是否有交集:
- 如果有交集,则合并区间,更新
t
为当前区间和上一个区间的最大结束位置。 - 如果没有交集,则计算间隙并累加到
ans
,然后更新t
为当前区间的结束位置。
- 如果有交集,则合并区间,更新
- 返回区间间隙总和
ans
。
- 初始化间隙总和
-
排序规则:
- 使用
sort
函数,并通过 Lambda 表达式定义排序规则。
- 使用
总结
- C语言 和 C++ 版本的代码逻辑完全一致,只是语法和库函数的使用有所不同。
- C语言 使用
qsort
进行排序,而 C++ 使用sort
函数。 - C++ 代码使用了
vector
来存储区间,更加灵活和现代化。
六、尾言
什么是华为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++)
一、问题描述 路灯照明问题 题目描述 在一条笔直的公路上安装了 ( N ) 个路灯,从位置 0 开始安装,路灯之间间距固定为 100 米。每个路灯都有自己的照明半径。请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。 输入描述 第一…...
SVGAPlayer error 处理
提示错误 Call to undeclared function OSAtomicCompareAndSwapPtrBarrier; ISO C99 and later do not support implicit function declarations Conflicting types for OSAtomicCompareAndSwapPtrBarrier Declaration of OSAtomicCompareAndSwapPtrBarrier must be imported …...
2024年12月电子学会青少年机器人技术等级考试(二级)实际操作试卷
2024.12 青少年机器人技术等级考试(二级)实际操作试卷 一、多选题 第 1 题 关于后轮驱动车说法正确的有哪些?( ) A.起步加速表现比前轮驱动好 B.容易转向过度 C.车身重量比前轮驱动更均衡 D.造价比前轮驱动车更高…...
Swift 专题二 语法速查
一 、变量 let, var 变量是可变的,使用 var 修饰,常量是不可变的,使用 let 修饰。类、结构体和枚举里的变量是属性。 var v1:String "hi" // 标注类型 var v2 "类型推导" let l1 "标题" // 常量class a {…...

Api网关Zuul
网关分类与开放API 开放API (OpenAPI) 企业需要将自身数据、能力等作为开发平台向外开放,通常会以REST的方式向外提供,最好的例子就是淘宝开放平台、腾讯公司的QQ开发平台、微信开放平台。开放API平台必然涉及到客户应用的接入、API权限的管理、调用次数…...

01设计模式(D3_设计模式类型 - D3_行为型模式)
目录 一、模版方法模式 1. 基本介绍 2. 应用案例一:豆浆制作问题 需求 代码实现 模板方法模式的钩子方法 3. View的draw(Android) Android中View的draw方法就是使用了模板方法模式 模板方法模式在 Spring 框架应用的源码分析 知识小…...

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测
角点检测(Corner Detection)是计算机视觉和图像处理中重要的步骤,主要用于提取图像中的关键特征,以便进行后续的任务,比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…...

费解的开关
费解的开关 你玩过“拉灯”游戏吗? 25 盏灯排成一个 55 的方形。 每一个灯都有一个开关,游戏者可以改变它的状态。 每一步,游戏者可以改变某一个灯的状态。 游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也…...

【机器学习】机器学习引领数学难题攻克:迈向未知数学领域的新突破
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 一、引言 在数学的浩瀚领域中,存在着诸多长期未解的难题,这些难题犹如高耸的山峰,吸引着无数数…...

Qt之QDjango-db的简单使用
QDjango是一款由C编写、依托于Qt库的Web开发框架,其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集,帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango&…...

缓存、数据库双写一致性解决方案
双写一致性问题的核心是确保数据库和缓存之间的数据同步,以避免缓存与数据库数据不同步的问题,尤其是在高并发和异步环境下。本文将探讨双写一致性面临的主要问题和解决方案,重点关注最终一致性。 本文讨论的是最终一致性问题 双写一致性面…...

SUnet: A multi-organ segmentation network based on multiple attention【医学图像分割】
一、论文信息 1.1、中文名称 名称:SUnet:基于多重注意力的多器官分割网络 1.2、论文关键词 医学图像分割、Transformer、注意力机制、高效特征融合模块 1.3、核心概述 本文提出了一种新颖有效的医学图像分割方法 SUnet,用于腹部和胸部的多…...
uniapp实现“到这儿去”、拨打电话功能
"到这儿去" 在 UniApp 中实现“到这儿去”的功能,即调起地图导航至指定位置,对于不同的平台(小程序、H5、App)有不同的处理方式。下面将简单介绍如何在这些平台上实现该功能,并讨论位置信息的获取。后面需求会用到,先来找一些相关资料,并不一定很准确,但也来…...

2025年入职/转行网络安全,该如何规划?网络安全职业规划
网络安全是一个日益增长的行业,对于打算进入或转行进入该领域的人来说,制定一个清晰且系统的职业规划非常重要。2025年,网络安全领域将继续发展并面临新的挑战,包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…...

【博客之星】2024年度个人成长、强化学习算法领域总结
📢在2025年初,非常荣幸能通过审核进入到《2024年度CSDN博客之星总评选》TOP300的年度评选中,排名40。这还是第一次来到这个阶段,作为一名博士研究生,还是备受鼓舞的。在这里我将以回顾的方式讲述一下这一年在CSDN中走过…...
HTML5 Canvas实现的跨年烟花源代码
以下是一份基于HTML5 Canvas实现的跨年烟花源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">…...

使用通用预训练范式为 3D 基础模型铺平道路
大家读完觉得有帮助记得关注和点赞!!!,本次是英文需要英文功底扎实的阅读。 Abstract In contrast to numerous NLP and 2D vision foundational models, learning a 3D foundational model poses considerably greater challenge…...

SpringMVC (2)
目录 1. RequestMapping 注解介绍 2. RequestMapping 使用 3. RequestMapping与请求方式 3.1 RequestMapping 支持Get和Post类型的请求 3.2 RequestMapping 指定接收某种请求 3.3 GetMapping和PostMapping 4. 传参 4.1 通过查询字符串传参 4.2 在 Body 中传参 4.2.1 …...
【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)
文章目录 S07L32 Exercise 09 - Macros1 训练目标2 操作指令2.1. 打开 macros-practice.txt 文件2.2. 练习1:将旧版 Python 代码转换为新版写法2.3. 练习2:根据列表内容批量创建 Shell 脚本2.4. 练习3:对电话号码作格式化处理2.5. 练习4&…...
爬楼梯问题(Leetcode 第70题)
爬楼梯问题(Leetcode 第70题) 问题描述 假设你正在爬楼梯。每次你可以爬 1 个或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...