【2024年华为OD机试】 (C卷,100分)- 素数之积(JavaScriptJava PythonC/C++)
一、问题描述
RSA 因数分解问题
题目描述
RSA 加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度。数据越大,安全系数越高。给定一个 32 位正整数,请对其进行因数分解,找出是哪两个素数的乘积。
输入描述
一个正整数 num
,满足 0 < num < 2147483647
。
输出描述
如果成功找到,以单个空格分割,从小到大输出两个素数;如果分解失败,请输出 -1 -1
。
用例
-
输入:
15
输出:3 5
-
输入:
27
输出:-1 -1
题目解析
1. 素数概念
素数(质数)是指大于 1 的自然数,且只能被 1 和它本身整除的数。例如,2、3、5、7、11 等都是素数。
2. 素数判定方法
在解决这个问题之前,我们需要掌握如何判断一个数是否为素数。常见的素数判定方法包括:
- 试除法:从 2 开始,依次试除到该数的平方根,如果都不能整除,则该数为素数。
- 埃拉托斯特尼筛法:适用于筛选一定范围内的素数。
- 米勒-拉宾素性测试:一种概率性算法,适用于大数的素数判定。
3. 题目要求
给定一个 32 位正整数,要求将其分解为两个素数的乘积。如果该数不能分解为两个素数的乘积,则输出 -1 -1
。
特殊情况
- 如果给定的数本身就是素数,那么它只能分解为
1
和它本身。由于1
不是素数,因此这种情况属于分解失败,输出-1 -1
。 - 如果一个数可以分解为两个素数的乘积,那么这两个素数必然是唯一的,因为素数无法再分解。
4. 解题思路
- 判断是否为素数:首先判断给定的数是否为素数。如果是素数,则直接输出
-1 -1
。 - 寻找素数因子:如果该数不是素数,则从
2
开始,依次寻找能整除该数的最小素数因子。 - 验证另一个因子是否为素数:找到第一个素数因子后,计算另一个因子,并验证其是否为素数。
- 输出结果:如果两个因子都是素数,则输出它们;否则输出
-1 -1
。
5. 示例分析
-
输入:15
15 不是素数,可以分解为3 * 5
,且3
和5
都是素数,因此输出3 5
。 -
输入:27
27 不是素数,可以分解为3 * 9
,但9
不是素数,因此输出-1 -1
。
6. 总结
该问题的核心在于如何高效地判断一个数是否为素数,并找到其素数因子。通过合理的算法设计和优化,可以在合理的时间内完成对大整数的因数分解。
二、JavaScript算法源码
以下是 JavaScript 代码的详细注释和讲解,代码逻辑与之前的 Java 版本一致,但使用了 JavaScript 的语法和特性。
代码结构
- 控制台输入获取:使用
readline
模块读取用户输入。 isPrime
函数:用于判断一个数是否为素数。getResult
函数:核心逻辑,用于判断给定的数是否可以分解为两个素数的乘积。
代码逐行讲解
1. 控制台输入获取
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});rl.on("line", (line) => {console.log(getResult(parseInt(line)));
});
- 功能:从控制台读取用户输入,并调用
getResult
函数处理输入。 - 关键点:
readline
是 Node.js 内置模块,用于读取用户输入。rl.on("line", ...)
监听用户输入,每次输入一行时触发回调函数。parseInt(line)
将输入的字符串转换为整数。- 调用
getResult
函数并输出结果。
2. isPrime
函数
function isPrime(n) {n = parseInt(n);if (n <= 3) {return n > 1;}
- 功能:判断一个数
n
是否为素数。 - 关键点:
- 如果
n
小于等于3
,则只有2
和3
是素数。
- 如果
if (n % 6 !== 1 && n % 6 !== 5) {return false;}
- 功能:利用素数的性质进行初步筛选。
- 关键点:
- 素数(除了
2
和3
)一定满足n % 6 === 1
或n % 6 === 5
。 - 如果不满足,则
n
不是素数。
- 素数(除了
for (let i = 5; i <= Math.sqrt(n); i += 6) {if (n % i === 0 || n % (i + 2) === 0) {return false;}}
- 功能:通过试除法判断
n
是否为素数。 - 关键点:
- 从
5
开始,每次增加6
,检查n
是否能被i
或i + 2
整除。 - 如果能整除,则
n
不是素数。
- 从
return true;
}
- 功能:如果
n
通过所有检查,则返回true
,表示n
是素数。
3. getResult
函数
function getResult(n) {// 如果n为素数,则必然不可能是两个素数之积if (isPrime(n)) {return "-1 -1";}
- 功能:判断给定的数
n
是否可以分解为两个素数的乘积。 - 关键点:
- 如果
n
是素数,则直接返回-1 -1
,因为素数无法分解为两个素数的乘积。
- 如果
// 假设i为n的因子for (let i = 2; i < n; i++) {// 若n不能整除i,则i不是n的因子,继续下次循环,找新的i// 若n可以整除i,则i就是n的因子if (n % i === 0) {// j为n的另一因子let j = n / i;
- 功能:遍历从
2
到n-1
的所有整数,寻找n
的因子。 - 关键点:
- 如果
n % i === 0
,说明i
是n
的一个因子。 - 计算另一个因子
j = n / i
。
- 如果
// 只有i,j因子都为素数时,n才是符合题意的素数之积if (isPrime(i) && isPrime(j)) {// 如果n为两个素数之积,则n只能分解为这两个因子,因为素数无法再次分解出其他因子,也就是说n不再有其他因子了(因子不包含1和自身)return i < j ? `${i} ${j}` : `${j} ${i}`;} else {// 如果i,j有一个不是素数因子,则说明n存在非素数因子,此时n不可能是素数之积// 如果i,j为相同的素数因子,则n不是满足题意的素数之积// 此时可以判定n不符合要求了,直接退出循环break;}}}
- 功能:检查找到的两个因子
i
和j
是否都是素数。 - 关键点:
- 如果
i
和j
都是素数,则返回这两个素数(按从小到大的顺序)。 - 如果
i
或j
不是素数,则说明n
无法分解为两个素数的乘积,直接退出循环并返回-1 -1
。
- 如果
return "-1 -1";
}
- 功能:如果遍历结束后仍未找到符合条件的素数因子,则返回
-1 -1
。
总结
-
代码逻辑:
- 判断
n
是否为素数。如果是素数,直接返回-1 -1
。 - 遍历从
2
到n-1
的所有整数,寻找n
的因子。 - 如果找到因子
i
,则计算另一个因子j = n / i
。 - 检查
i
和j
是否都是素数。如果是,则返回这两个素数;否则,继续查找。 - 如果遍历结束后仍未找到符合条件的素数因子,则返回
-1 -1
。
- 判断
-
代码特点:
- 使用
readline
模块实现控制台输入。 - 通过
isPrime
函数高效判断素数。 - 通过遍历和试除法寻找因子。
- 代码逻辑清晰,注释详细,易于理解。
- 使用
三、Java算法源码
以下是代码的详细注释和讲解:
代码结构
main
方法:程序的入口,负责读取用户输入并调用getResult
方法。getResult
方法:核心逻辑,用于判断给定的数是否可以分解为两个素数的乘积。isPrime
方法:用于判断一个数是否为素数。
代码逐行讲解
1. main
方法
public static void main(String[] args) {Scanner sc = new Scanner(System.in); // 创建Scanner对象,用于读取用户输入System.out.println(getResult(sc.nextInt())); // 读取用户输入的整数,调用getResult方法并输出结果
}
- 功能:从用户输入中读取一个整数,调用
getResult
方法处理该整数,并输出结果。 - 关键点:
Scanner
用于读取用户输入。sc.nextInt()
读取用户输入的整数。getResult
方法返回结果后,直接通过System.out.println
输出。
2. getResult
方法
public static String getResult(int n) {// 如果n为素数,则必然不可能是两个素数之积if (isPrime(n)) {return "-1 -1";}
- 功能:判断给定的数
n
是否可以分解为两个素数的乘积。 - 关键点:
- 如果
n
是素数,则直接返回-1 -1
,因为素数无法分解为两个素数的乘积(只能分解为1
和它本身,而1
不是素数)。
- 如果
// 假设i为n的因子for (int i = 2; i < n; i++) {// 若n不能整除i,则i不是n的因子,继续下次循环,找新的i// 若n可以整除i,则i就是n的因子if (n % i == 0) {// j为n的另一因子int j = n / i;
- 功能:遍历从
2
到n-1
的所有整数,寻找n
的因子。 - 关键点:
- 如果
n % i == 0
,说明i
是n
的一个因子。 - 计算另一个因子
j = n / i
。
- 如果
// 只有i,j因子都为素数时,n才是符合题意的素数之积if (isPrime(i) && isPrime(j)) {// 如果n为两个素数之积,则n只能分解为这两个因子,因为素数无法再次分解出其他因子,也就是说n不再有其他因子了(因子不包含1和自身)return i < j ? i + " " + j : j + " " + i;} else {// 如果i,j有一个不是素数因子,则说明n存在非素数因子,此时n不可能是素数之积// 如果i,j为相同的素数因子,则n不是满足题意的素数之积// 此时可以判定n不符合要求了,直接退出循环break;}}}
- 功能:检查找到的两个因子
i
和j
是否都是素数。 - 关键点:
- 如果
i
和j
都是素数,则返回这两个素数(按从小到大的顺序)。 - 如果
i
或j
不是素数,则说明n
无法分解为两个素数的乘积,直接退出循环并返回-1 -1
。
- 如果
return "-1 -1";
}
- 功能:如果遍历结束后仍未找到符合条件的素数因子,则返回
-1 -1
。
3. isPrime
方法
public static boolean isPrime(int n) {if (n <= 3) return n > 1; // 2和3是素数,1不是素数
- 功能:判断一个数
n
是否为素数。 - 关键点:
- 如果
n
小于等于3
,则只有2
和3
是素数。
- 如果
if (n % 6 != 1 && n % 6 != 5) return false; // 素数一定满足 n % 6 == 1 或 n % 6 == 5
- 功能:利用素数的性质进行初步筛选。
- 关键点:
- 素数(除了
2
和3
)一定满足n % 6 == 1
或n % 6 == 5
。 - 如果不满足,则
n
不是素数。
- 素数(除了
for (int i = 5; i <= Math.sqrt(n); i += 6) {if (n % i == 0 || n % (i + 2) == 0) {return false;}}
- 功能:通过试除法判断
n
是否为素数。 - 关键点:
- 从
5
开始,每次增加6
,检查n
是否能被i
或i + 2
整除。 - 如果能整除,则
n
不是素数。
- 从
return true; // 如果上述条件都不满足,则n是素数
}
- 功能:如果
n
通过所有检查,则返回true
,表示n
是素数。
总结
-
代码逻辑:
- 判断
n
是否为素数。如果是素数,直接返回-1 -1
。 - 遍历从
2
到n-1
的所有整数,寻找n
的因子。 - 如果找到因子
i
,则计算另一个因子j = n / i
。 - 检查
i
和j
是否都是素数。如果是,则返回这两个素数;否则,继续查找。 - 如果遍历结束后仍未找到符合条件的素数因子,则返回
-1 -1
。
- 判断
-
代码特点:
- 通过
isPrime
方法高效判断素数。 - 通过遍历和试除法寻找因子。
- 代码逻辑清晰,注释详细,易于理解。
- 通过
四、Python算法源码
以下是 Python 代码的详细注释和讲解,代码逻辑与之前的 Java 和 JavaScript 版本一致,但使用了 Python 的语法和特性。
代码结构
- 输入获取:使用
input()
函数读取用户输入。 isPrime
函数:用于判断一个数是否为素数。getResult
函数:核心逻辑,用于判断给定的数是否可以分解为两个素数的乘积。- 算法调用:调用
getResult
函数并输出结果。
代码逐行讲解
1. 输入获取
n = int(input())
- 功能:从控制台读取用户输入,并将其转换为整数。
- 关键点:
input()
函数用于读取用户输入,返回的是字符串类型。int()
函数将字符串转换为整数。
2. isPrime
函数
def isPrime(n):if n <= 3:return n > 1
- 功能:判断一个数
n
是否为素数。 - 关键点:
- 如果
n
小于等于3
,则只有2
和3
是素数。
- 如果
if n % 6 != 1 and n % 6 != 5:return False
- 功能:利用素数的性质进行初步筛选。
- 关键点:
- 素数(除了
2
和3
)一定满足n % 6 == 1
或n % 6 == 5
。 - 如果不满足,则
n
不是素数。
- 素数(除了
for i in range(5, int(math.sqrt(n)) + 1, 6):if n % i == 0 or n % (i + 2) == 0:return False
- 功能:通过试除法判断
n
是否为素数。 - 关键点:
- 从
5
开始,每次增加6
,检查n
是否能被i
或i + 2
整除。 - 如果能整除,则
n
不是素数。
- 从
return True
- 功能:如果
n
通过所有检查,则返回True
,表示n
是素数。
3. getResult
函数
def getResult(n):# 如果n为素数,则必然不可能是两个素数之积if isPrime(n):return "-1 -1"
- 功能:判断给定的数
n
是否可以分解为两个素数的乘积。 - 关键点:
- 如果
n
是素数,则直接返回-1 -1
,因为素数无法分解为两个素数的乘积。
- 如果
# 假设i为n的因子for i in range(2, n):# 若n不能整除i,则i不是n的因子,继续下次循环,找新的i# 若n可以整除i,则i就是n的因子if n % i == 0:# j为n的另一因子j = n // i
- 功能:遍历从
2
到n-1
的所有整数,寻找n
的因子。 - 关键点:
- 如果
n % i == 0
,说明i
是n
的一个因子。 - 计算另一个因子
j = n // i
(使用整数除法)。
- 如果
# 只有i,j因子都为素数时,n才是符合题意的素数之积if isPrime(i) and isPrime(j):# 如果n为两个素数之积,则n只能分解为这两个因子,因为素数无法再次分解出其他因子,也就是说n不再有其他因子了(因子不包含1和自身)return f"{i} {j}" if i < j else f"{j} {i}"else:# 如果i,j有一个不是素数因子,则说明n存在非素数因子,此时n不可能是素数之积# 如果i,j为相同的素数因子,则n不是满足题意的素数之积# 此时可以判定n不符合要求了,直接退出循环break
- 功能:检查找到的两个因子
i
和j
是否都是素数。 - 关键点:
- 如果
i
和j
都是素数,则返回这两个素数(按从小到大的顺序)。 - 如果
i
或j
不是素数,则说明n
无法分解为两个素数的乘积,直接退出循环并返回-1 -1
。
- 如果
return "-1 -1"
- 功能:如果遍历结束后仍未找到符合条件的素数因子,则返回
-1 -1
。
4. 算法调用
print(getResult(n))
- 功能:调用
getResult
函数并输出结果。 - 关键点:
print()
函数用于输出结果。
总结
-
代码逻辑:
- 判断
n
是否为素数。如果是素数,直接返回-1 -1
。 - 遍历从
2
到n-1
的所有整数,寻找n
的因子。 - 如果找到因子
i
,则计算另一个因子j = n // i
。 - 检查
i
和j
是否都是素数。如果是,则返回这两个素数;否则,继续查找。 - 如果遍历结束后仍未找到符合条件的素数因子,则返回
-1 -1
。
- 判断
-
代码特点:
- 使用
input()
函数实现控制台输入。 - 通过
isPrime
函数高效判断素数。 - 通过遍历和试除法寻找因子。
- 代码逻辑清晰,注释详细,易于理解。
- 使用
五、C/C++算法源码:
以下是 C 语言和 C++ 代码的详细注释和讲解,代码逻辑与之前的 Python、Java 和 JavaScript 版本一致,但使用了 C 和 C++ 的语法和特性。
C 语言代码
代码结构
main
函数:程序的入口,负责读取用户输入并调用getResult
函数。getResult
函数:核心逻辑,用于判断给定的数是否可以分解为两个素数的乘积。isPrime
函数:用于判断一个数是否为素数。
代码逐行讲解
1. main
函数
#include <stdio.h>
#include <math.h>void getResult(int n);
int isPrime(int n);int main() {int n;scanf("%d", &n); // 读取用户输入的整数getResult(n); // 调用 getResult 函数处理输入return 0;
}
- 功能:从用户输入中读取一个整数,调用
getResult
函数处理该整数。 - 关键点:
scanf("%d", &n)
用于读取用户输入的整数。getResult(n)
调用核心逻辑函数。
2. getResult
函数
void getResult(int n) {// 如果n为素数,则必然不可能是两个素数之积if (isPrime(n)) {puts("-1 -1"); // 输出 -1 -1return;}
- 功能:判断给定的数
n
是否可以分解为两个素数的乘积。 - 关键点:
- 如果
n
是素数,则直接输出-1 -1
,因为素数无法分解为两个素数的乘积。
- 如果
// 假设i为n的因子for (int i = 2; i < n; i++) {// 若n不能整除i,则i不是n的因子,继续下次循环,找新的i// 若n可以整除i,则i就是n的因子if (n % i == 0) {// j为n的另一因子int j = n / i;
- 功能:遍历从
2
到n-1
的所有整数,寻找n
的因子。 - 关键点:
- 如果
n % i == 0
,说明i
是n
的一个因子。 - 计算另一个因子
j = n / i
。
- 如果
// 只有i,j因子都为素数时,n才是符合题意的素数之积if (isPrime(i) && isPrime(j)) {// 如果n为两个素数之积,则n只能分解为这两个因子,因为素数无法再次分解出其他因子,也就是说n不再有其他因子了(因子不包含1和自身)if (i < j) {printf("%d %d", i, j); // 输出较小的素数在前} else {printf("%d %d", j, i); // 输出较小的素数在前}return;} else {// 如果i,j有一个不是素数因子,则说明n存在非素数因子,此时n不可能是素数之积// 如果i,j为相同的素数因子,则n不是满足题意的素数之积// 此时可以判定n不符合要求了,直接退出循环break;}}}
- 功能:检查找到的两个因子
i
和j
是否都是素数。 - 关键点:
- 如果
i
和j
都是素数,则输出这两个素数(按从小到大的顺序)。 - 如果
i
或j
不是素数,则说明n
无法分解为两个素数的乘积,直接退出循环。
- 如果
puts("-1 -1"); // 输出 -1 -1
}
- 功能:如果遍历结束后仍未找到符合条件的素数因子,则输出
-1 -1
。
3. isPrime
函数
int isPrime(int n) {if (n <= 3) return n > 1; // 2和3是素数,1不是素数
- 功能:判断一个数
n
是否为素数。 - 关键点:
- 如果
n
小于等于3
,则只有2
和3
是素数。
- 如果
if (n % 6 != 1 && n % 6 != 5) {return 0; // 素数一定满足 n % 6 == 1 或 n % 6 == 5}
- 功能:利用素数的性质进行初步筛选。
- 关键点:
- 素数(除了
2
和3
)一定满足n % 6 == 1
或n % 6 == 5
。 - 如果不满足,则
n
不是素数。
- 素数(除了
for (int i = 5; i <= sqrt(n); i += 6) {if (n % i == 0 || n % (i + 2) == 0) {return 0; // 如果能整除,则n不是素数}}
- 功能:通过试除法判断
n
是否为素数。 - 关键点:
- 从
5
开始,每次增加6
,检查n
是否能被i
或i + 2
整除。 - 如果能整除,则
n
不是素数。
- 从
return 1; // 如果上述条件都不满足,则n是素数
}
- 功能:如果
n
通过所有检查,则返回1
,表示n
是素数。
C++ 代码
C++ 代码与 C 语言代码几乎完全相同,只需稍作修改:
-
头文件:
- 将
#include <stdio.h>
替换为#include <iostream>
。 - 将
#include <math.h>
替换为#include <cmath>
。
- 将
-
输入输出:
- 将
scanf
替换为std::cin
。 - 将
printf
替换为std::cout
。 - 将
puts
替换为std::cout
。
- 将
以下是修改后的 C++ 代码:
#include <iostream>
#include <cmath>void getResult(int n);
bool isPrime(int n);int main() {int n;std::cin >> n; // 读取用户输入的整数getResult(n); // 调用 getResult 函数处理输入return 0;
}void getResult(int n) {// 如果n为素数,则必然不可能是两个素数之积if (isPrime(n)) {std::cout << "-1 -1" << std::endl; // 输出 -1 -1return;}// 假设i为n的因子for (int i = 2; i < n; i++) {// 若n不能整除i,则i不是n的因子,继续下次循环,找新的i// 若n可以整除i,则i就是n的因子if (n % i == 0) {// j为n的另一因子int j = n / i;// 只有i,j因子都为素数时,n才是符合题意的素数之积if (isPrime(i) && isPrime(j)) {// 如果n为两个素数之积,则n只能分解为这两个因子,因为素数无法再次分解出其他因子,也就是说n不再有其他因子了(因子不包含1和自身)if (i < j) {std::cout << i << " " << j << std::endl; // 输出较小的素数在前} else {std::cout << j << " " << i << std::endl; // 输出较小的素数在前}return;} else {// 如果i,j有一个不是素数因子,则说明n存在非素数因子,此时n不可能是素数之积// 如果i,j为相同的素数因子,则n不是满足题意的素数之积// 此时可以判定n不符合要求了,直接退出循环break;}}}std::cout << "-1 -1" << std::endl; // 输出 -1 -1
}// 判断n是否为素数
bool isPrime(int n) {if (n <= 3) return n > 1; // 2和3是素数,1不是素数if (n % 6 != 1 && n % 6 != 5) {return false; // 素数一定满足 n % 6 == 1 或 n % 6 == 5}for (int i = 5; i <= std::sqrt(n); i += 6) {if (n % i == 0 || n % (i + 2) == 0) {return false; // 如果能整除,则n不是素数}}return true; // 如果上述条件都不满足,则n是素数
}
总结
-
C 语言和 C++ 代码逻辑一致:
- 判断
n
是否为素数。如果是素数,直接输出-1 -1
。 - 遍历从
2
到n-1
的所有整数,寻找n
的因子。 - 如果找到因子
i
,则计算另一个因子j = n / i
。 - 检查
i
和j
是否都是素数。如果是,则输出这两个素数;否则,继续查找。 - 如果遍历结束后仍未找到符合条件的素数因子,则输出
-1 -1
。
- 判断
-
代码特点:
- 使用
scanf
和printf
(C 语言)或std::cin
和std::cout
(C++)实现输入输出。 - 通过
isPrime
函数高效判断素数。 - 通过遍历和试除法寻找因子。
- 代码逻辑清晰,注释详细,易于理解。
- 使用
六、尾言
什么是华为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机试】 (C卷,100分)- 素数之积(JavaScriptJava PythonC/C++)
一、问题描述 RSA 因数分解问题 题目描述 RSA 加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度。数据越大,安全系数越高。给定一个 32 位正整数,请对其进行因数分解,找出是哪两个素数的乘积。 输入描述 …...
【C++模板】:如何判断自定义类型是否实现某个函数
一、引子 偶尔我们会面对这样的尴尬的场景,我们需要显示的去判断在某个自定义类型中,是否已经提供了我们期待的API接口,以避免产生“莫须有”的错误。阁下该如何破解此问题! 这里,直接给出一种通用的方法,…...

基于微信小程序的汽车保养系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

电子应用设计方案102:智能家庭AI鱼缸系统设计
智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境,同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定,包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…...
【Elasticsearch】RestClient操作文档
RestClient操作文档 新增文档实体类API语法 查询文档删除文档修改文档批量导入文档小结 新增文档 将数据库中的信息导入elasticsearch中 以商品数据为例 实体类 定义一个索引库结构对应的实体。 Data ApiModel(description "索引库实体") public class ItemDoc{…...

内存条的构造、原理及性能参数
内存条的构造、原理及性能参数 一、内存条的构造1.1 外观结构1.1.1 芯片:大脑1.1.2 PCB板:骨架1.1.3 金手指:接口1.1.4 电容电阻:稳压、稳流1.1.5 防呆缺口:防错 1.2 内部层次结构 二、内存条的工作原理2.1 数据的“搬…...

鸿蒙模块概念和应用启动相关类(HAP、HAR、HSP、AbilityStage、UIAbility、WindowStage、window)
目录 鸿蒙模块概念 HAP entry feature har shared 使用场景 HAP、HAR、HSP介绍 HAP、HAR、HSP开发 应用的启动 AbilityStage UIAbility WindowStage Window 拉起应用到显示到前台流程 鸿蒙模块概念 HAP hap包是手机安装的最小单元,1个app包含一个或…...
SQLark 百灵连接工具便捷功能之生成数据库测试数据
参考此文: SQLark百灵连接工具--数据生成...
ChirpIoT技术的优势以及局限性
ChirpIoT是一种由上海磐启微电子开发的国产无线射频通讯技术,ChirpIoT技术基于磐启多年对雷达等线性扩频信号的深入研究,并在此基础上对线性扩频信号的变化进行了改进,实现了远距离传输的一种无线通信技术。相关产品型号有E29-400T22D、E290-…...
Jetpack架构组件学习——使用Glance实现桌面小组件
基本使用 1.添加依赖 添加Glance依赖: // For AppWidgets supportimplementation "androidx.glance:glance-appwidget:1.1.0"// For interop APIs with Material 3implementation "androidx.glance:glance-material3:1.1.0"// For interop APIs with Mater…...

C++函数——fill
在C中,std::fill 是标准库提供的一个算法适用于几乎所有类型的容器,只要这些容器支持迭代器操作。具体来说,std::fill 的适用性取决于容器是否提供了满足其要求的迭代器类型,用于将指定范围内的所有元素设置为某个特定值。它是一个…...

二叉树(了解)c++
二叉树是一种特殊的树型结构,它的特点是: 每个结点至多只有2棵子树(即二叉树中不存在度大于2的结点) 并且二叉树的子树有左右之分,其次序不能任意颠倒,因此是一颗有序树 以A结点为例,左边的B是它的左孩子,右边的C是…...
备赛蓝桥杯之第十五届职业院校组省赛第三题:产品360度展示
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
业余无线电 对讲机常用频率使用
我自己的总结是,基本可以无忧使用: 144.035-145.800 146.000-148.000 430.000-431.900 432.240-435.000 438.000-439.000 50Mhz一般手台不支持,暂不记录。 以下为附录可以自行阅读,本文内容如有错误请留言指正。 特定波段…...
个性化的语言模型构建思路
将开源模型(如Llama3、Qwen、Falcon3 … 等)转变为个人专属的大语言模型,通常涉及知识库的构建、微调(fine-tuning)和模型定制等步骤。下面提供一个详细的技术解决方案,涵盖了如何利用现有的资料(如文档、PDF、Excel、PPT、图片、语音、视频等)将开源模型转换为个人专属…...

QT开发技术【QFileDialog卡顿问题】
一、直接用QFileDialog 在window 一般卡顿7秒 qDebug() << "begin:" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");QDateTime sTime QDateTime::currentDateTime();QString str QFileDialog::getOpenFileName(null…...
关于为什么java中nextInt()和nextLine()不能混用 | nextInt()和nextInt()之类的可以一起用
键盘录入的区别: 第一套体系:遇到空格、制表符、回车都结束,并且都不接收 nextInt()、nextDouble()、next() 遇到空格、制表符、回车就结束,只接收其之前的数据,空格以及空格之后的数据都在缓冲区内,如果…...

Android OpenGL(六) 纹理
纹理 纹理是一个2D图片(甚至也有1D和3D的纹理), 它可以用来添加物体的细节;你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的 房子上,这样你的房子看起来就像有砖墙外表了 纹理环绕方式 纹理坐…...
git和idea重新安装后提交异常
场景:我重装了系统,idea装了2024.3版本的,git也重新装了,但是项目中还是有.git文件夹的,下载了idea的码云插件后,提交报错如下: 异常:Error updating changes: detected dubious ow…...

leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先
(一)问题描述 236. 二叉树的最近公共祖先 - 力扣(LeetCode)236. 二叉树的最近公共祖先 - 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科 [https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...