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

STM32-CAN总线
1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线(CAN_H、CAN_L),线路少,无需共地差分信号通信(相对的是单端信号)&#…...

node.js 07.npm下包慢的问题与nrm的使用
一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…...

ubuntu改变swap存储空间,遇到 fallocate 失败: 文本文件忙
ubuntu改变swap存储空间,遇到 fallocate 失败: 文本文件忙 sudo fallocate -l 16G /swapfile fallocate: fallocate 失败: 文本文件忙这种情况是swap空间正在使用,需要先关闭swap分区: sudo swapoff /swapfile sudo fallocate -l 16G /swap…...

20250122-正则表达式
1. 正则标记 表示一位字符:\\ 表示指定的一位字符:x 表示任意的一位字符:. 表示任意一位数字:\d 表示任意一位非数字:\D 表示任意一个字母:[a-zA-Z](大写或小写) 表示任意一个…...

QT之CMAKE教程
介绍 CMake 是一个跨平台的自动化构建系统,它使用配置文件(称为 CMakeLists.txt)来生成标准的构建文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程文件。CMake 能够支持多种编程语言,尤其是 C 和 C&#…...

网络安全 | 0day漏洞介绍
关注:CodingTechWork 引言 在网络安全领域,0day漏洞(Zero-day Vulnerability)是指一个尚未被厂商、开发者或安全人员发现、修复或发布修补程序的安全漏洞。0day漏洞是黑客利用的一个重要攻击工具,因其未被披露或未被修…...

关于WPF中ComboBox文本查询功能
一种方法是使用事件(包括MVVM的绑定) <ComboBox TextBoxBase.TextChanged"ComboBox_TextChanged" /> 然而运行时就会发现,这个事件在疯狂的触发,很频繁 在实际应用中,如果关联查询数据库࿰…...

07_游戏加载窗口
隐藏动态提示窗口 创建空节点 命名为 LoadingWnd 意为加载窗口 并设置全屏 在子级下创建Image作为加载背景 也设置成全屏 将以下资源放进Art文件夹中 设置好精灵模式后拖拽至 Image的Source Image框选 创建文本作为提示内容 增加描边组件OutLine可以美化字体 创建Image作为加载…...

awk命令进阶
1.连接文件 awk NRFNR{a[$1]$0;next} NR!FNR{ if(($5) in a) print a[$1],$0 } file1 file2 命令详解: 这个命令的目的是将 file1 和 file2 基于某个共同字段进行连接(类似于 SQL 中的 JOIN 操作)。下面我们逐步解析它的工作原理。 1. NRF…...

解锁Java中的国密算法:安全保障的密钥
一、引言 在数字化浪潮席卷全球的当下,信息安全已然成为国家、企业乃至个人无法忽视的重要议题。国密算法,作为我国自主研发的密码算法体系,宛如坚固的盾牌,为国家信息安全筑起了一道坚不可摧的防线。它的诞生,不仅承载…...