【2024年华为OD机试】(B卷,100分)- IPv4地址转换成整数 (Java & JS & Python&C/C++)
一、问题描述
题目描述
存在一种虚拟IPv4地址,由4小节组成,每节的范围为0~255,以 #
号间隔。虚拟IPv4地址可以转换为一个32位的整数。例如:
128#0#255#255
,转换为32位整数的结果为2147549183
(0x8000FFFF
)。1#0#0#0
,转换为32位整数的结果为16777216
(0x01000000
)。
现以字符串形式给出一个虚拟IPv4地址,限制第1小节的范围为 1~128
,即每一节范围分别为 (1~128)#(0~255)#(0~255)#(0~255)
,要求每个IPv4地址只能对应到唯一的整数上。
如果是非法IPv4,返回 invalid IP
。
输入描述
输入一行,虚拟IPv4地址格式字符串。
输出描述
输出一行,按照要求输出整型或者特定字符 invalid IP
。
备注
输入不能确保是合法的IPv4地址,需要对非法IPv4(空串,含有IP地址中不存在的字符,非合法的 #
分十进制,十进制整数不在合法区间内)进行识别,返回特定错误。
用例
输入
100#101#1#5
输出
1684340997
说明
无
输入
1#2#3
输出
invalid IP
说明
无
题目解析
问题理解
题目要求我们将一个虚拟IPv4地址转换为一个32位的整数。虚拟IPv4地址由4小节组成,每节的范围为 0~255
,以 #
号间隔。特别地,第1小节的范围限制为 1~128
。如果输入的IPv4地址非法,则需要返回 invalid IP
。
关键点
- IPv4地址格式:IPv4地址由4小节组成,每节以
#
号分隔。 - 范围限制:
- 第1小节的范围为
1~128
。 - 其他小节的范围为
0~255
。
- 第1小节的范围为
- 非法IPv4地址:包括空串、含有非法字符、小节数量不足、小节数值超出范围等情况。
- 转换规则:将IPv4地址转换为32位整数,每个小节对应8位。
解题思路
步骤1:输入校验
首先需要对输入的字符串进行校验,确保其符合IPv4地址的格式要求。具体包括:
- 空串检查:如果输入为空串,直接返回
invalid IP
。 - 分隔符检查:检查字符串是否包含3个
#
号,确保有4个小节。 - 小节数值检查:
- 第1小节的范围为
1~128
。 - 其他小节的范围为
0~255
。
- 第1小节的范围为
- 非法字符检查:确保每个小节只包含数字字符。
步骤2:转换逻辑
如果输入校验通过,则将IPv4地址转换为32位整数。转换规则如下:
- 将每个小节转换为对应的8位二进制数。
- 将4个小节的二进制数拼接成一个32位的二进制数。
- 将32位二进制数转换为十进制整数。
步骤3:异常处理
在转换过程中,如果发现任何异常情况(如非法字符、数值超出范围等),则直接返回 invalid IP
。
结论
通过严格的输入校验和转换逻辑,我们可以将合法的虚拟IPv4地址转换为32位整数,并对非法输入进行有效处理。最终输出转换后的整数或 invalid IP
。
最终答案
输出一个整数或 invalid IP
,表示虚拟IPv4地址转换后的结果或错误信息。
二、JavaScript算法源码
这段 JavaScript 代码用于判断输入的 IP 地址是否合法,并将合法的 IP 地址转换成十六进制数的形式。代码实现使用了 Node.js 下的 readline
模块来读取控制台输入,下面是代码的详细注释和讲解。
代码结构与详细注释
// 导入 Node.js 模块 'readline',用于处理输入输出
const readline = require("readline");
// 创建 readline 接口实例,用于读取标准输入(控制台输入)和输出
const rl = readline.createInterface({
input: process.stdin, // 标准输入
output: process.stdout, // 标准输出
});
// 监听 'line' 事件,在每次输入行时触发
rl.on("line", (line) => {
console.log(getResult(line)); // 对输入行调用 getResult 函数,并将返回结果输出
});
// 判断和转换输入字符串的核心函数
function getResult(s) {
const ip = s.split("#"); // 将输入字符串以 '#' 分隔,假设 IP 地址是通过 '#' 分隔的格式
// IP 地址应由四部分组成,不符合则为无效
if (ip.length != 4) {
return "invalid IP";
}
// 验证 IP 地址四部分的合法性
if (
!isValid(ip[0], 1, 128) || // 第一部分应在 1 到 128 之间
!isValid(ip[1], 0, 255) || // 第二、三、四部分应在 0 到 255 之间
!isValid(ip[2], 0, 255) ||
!isValid(ip[3], 0, 255)
) {
return "invalid IP";
}
// 将每个部分转换为十六进制字符串,并连接成完整的十六进制数
// parseInt 第二个参数为 16,表示将字符串按十六进制转换为整数
return parseInt(
getHexStr(ip[0]) + getHexStr(ip[1]) + getHexStr(ip[2]) + getHexStr(ip[3]),
16
);
}
// 验证 IP 地址的每部分是否合法
function isValid(s, from, to) {
// 使用正则表达式检测是否包含非数字字符
if (/[^0-9]/.test(s)) return false;
// 转换为整数并检查前导零的情况
const num = parseInt(s);
if (num + "" != s) return false;
// 检查数值是否在指定范围内
return num >= from && num <= to;
}
// 将十进制数字符串转换为两位十六进制字符串
function getHexStr(s) {
let hexStr = parseInt(s).toString(16); // 使用 toString(16) 将整数转换为十六进制字符串
// 如果长度小于2,就补充前导零
if (hexStr.length < 2) hexStr = "0" + hexStr;
return hexStr;
}
代码讲解
-
输入处理:
- 使用
readline
模块的createInterface
来读取控制台输入。 - 通过
rl.on('line')
事件监听输入,每输入一行时调用getResult
函数处理。
- 使用
-
核心函数
getResult
:- 通过
split("#")
将输入字符串按#
分隔,假设 IP 地址是通过#
分隔的。 - 验证 IP 地址是否由四个部分组成。如果不是,则返回 “invalid IP”。
- 使用
isValid
函数验证每个部分是否在指定范围内,检测是否为合法 IP 地址。
- 通过
-
函数
isValid
:- 检查字符串是否仅包含数字。
- 检查是否有前导零(如
012
),通过比较parseInt
转换后的值与原字符串。 - 检查数值是否在
from
和to
指定的范围内。
-
函数
getHexStr
:- 将十进制字符串转换为十六进制字符串。
- 如果转换后的字符串长度小于 2,则在前面补 0 以确保每部分的十六进制表示是两位。
-
输出处理:
- 如果 IP 地址合法,则将其各部分转换为十六进制形式拼接,使用
parseInt
以十六进制转为整数输出。 - 否则,直接返回 “invalid IP”。
- 如果 IP 地址合法,则将其各部分转换为十六进制形式拼接,使用
总结
这段代码有效地将 IP 地址从字符串形式转换为整数表示,并进行了有效性验证。通过将 IP 的四个部分转换为十六进制,可以用来进一步进行网络相关的计算或验证。此代码结构清晰,并使用了正则表达式和简单的字符串操作来确保输入的合法性。
三、Java算法源码
这段 Java 程序的功能是验证 IP 地址的合法性,并将合法的 IP 地址转换成十六进制形式,然后将其转为十进制格式的 long
类型数字。以下是代码的详细注释和讲解。
代码结构与各部分功能
这段代码可以分为以下部分:
- 主方法
main
:- 获取输入并调用核心函数
getResult
。
- 获取输入并调用核心函数
- 核心方法
getResult
:- 验证 IP 地址格式是否正确。
- 验证 IP 地址的每一部分是否合法。
- 将合法的 IP 地址转换为十进制数字表示。
- 辅助方法
isValid
:- 验证 IP 地址的单个部分是否符合规范。
- 辅助方法
getHexString
:- 将十进制数字转换为对应的两位十六进制字符串。
主方法 main
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // 创建 Scanner 对象,用于读取用户输入
System.out.println(getResult(sc.nextLine())); // 读取一行输入,调用 getResult 方法,并打印结果
}
- 核心功能:
- 使用
Scanner
获取用户输入的 IP 地址。 - 将输入传递给核心方法
getResult
,输出结果。
- 使用
- 输入格式:
- 假设输入的 IP 地址是用
#
分隔的字符串,例如:192#168#0#1
。
- 假设输入的 IP 地址是用
- 输出结果:
- 如果输入的 IP 地址合法,输出其十进制表示。
- 如果输入的 IP 地址不合法,输出
"invalid IP"
。
核心方法 getResult
public static String getResult(String s) {
String[] ip = s.split("#"); // 将输入字符串按 '#' 进行分割
// IP 地址必须有且仅有四部分,不符合则为无效
if (ip.length != 4) return "invalid IP";
// 验证 IP 地址的每一部分是否合法
if (!isValid(ip[0], 1, 128) // 第一部分需在 1 到 128 之间
|| !isValid(ip[1], 0, 255) // 第二部分需在 0 到 255 之间
|| !isValid(ip[2], 0, 255) // 第三部分需在 0 到 255 之间
|| !isValid(ip[3], 0, 255)) { // 第四部分需在 0 到 255 之间
return "invalid IP"; // 若有任何一部分不合法,则返回无效
}
// 将 IP 地址的每一部分转换为十六进制字符串,并拼接在一起
// 使用 Long.parseLong 以 16 进制为基数转换为十进制
return Long.parseLong(
getHexString(ip[0]) + getHexString(ip[1]) + getHexString(ip[2]) + getHexString(ip[3]),
16)
+ ""; // 将长整型结果转换为字符串并返回
}
- 功能描述:
- 首先通过
split("#")
将输入 IP 地址分隔为四部分。 - 检查是否有且只有四部分,若不是,则直接返回
"invalid IP"
。 - 调用
isValid
方法,验证每部分的合法性:- 第一部分范围为
1 ~ 128
。 - 其余三部分范围为
0 ~ 255
。
- 第一部分范围为
- 如果 IP 地址合法,则调用
getHexString
方法将每部分转换为十六进制字符串。 - 将这些十六进制字符串拼接成一个完整的字符串,并用
Long.parseLong
将其解析为十进制数字。 - 返回该十进制数字的字符串形式。
- 首先通过
辅助方法 isValid
public static boolean isValid(String s, int from, int to) {
// 检查是否仅包含数字字符,正则表达式 "^\\d+$" 表示全为数字
if (!s.matches("^\\d+$")) return false;
// 转换为整数并检查是否有前导零
int num = Integer.parseInt(s);
if (!s.equals(num + "")) return false;
// 检查数值是否在规定范围内
return num >= from && num <= to;
}
- 功能描述:
- 使用正则表达式
^\\d+$
检查字符串是否仅包含数字字符。 - 调用
Integer.parseInt
将字符串转换为整数。 - 检查是否有前导零(如
012
),通过比较原字符串和转换后的字符串。 - 检查整数是否在指定范围
[from, to]
内。
- 使用正则表达式
- 返回值:
- 如果字符串合法且在范围内,返回
true
。 - 否则,返回
false
。
- 如果字符串合法且在范围内,返回
辅助方法 getHexString
public static String getHexString(String num) {
String hexStr = Integer.toHexString(Integer.parseInt(num)); // 转换为十六进制字符串
// 如果长度不足两位,则前面补零
if (hexStr.length() < 2) hexStr = "0" + hexStr;
return hexStr;
}
- 功能描述:
- 调用
Integer.parseInt
将字符串转换为十进制整数。 - 调用
toHexString
将整数转换为十六进制字符串。 - 如果转换后的字符串长度不足两位(如
0
->0
),则在前面补0
。
- 调用
- 返回值:
- 返回一个两位长度的十六进制字符串。
- 示例:
- 输入
"10"
-> 输出"0a"
。 - 输入
"255"
-> 输出"ff"
。
- 输入
示例运行
示例输入:
192#168#0#1
输入解析:
- 输入 IP 地址分割为:
["192", "168", "0", "1"]
。 - 验证:
- 第一部分
192
在[1, 128]
之外,返回"invalid IP"
。
- 第一部分
示例输入:
127#0#0#1
输入解析:
- 分割后为:
["127", "0", "0", "1"]
。 - 验证:
- 第一部分
127
在[1, 128]
内。 - 其余部分均在
[0, 255]
内。
- 第一部分
- 转换为十六进制拼接:
"7f000001"
。 - 转换为十进制:
2130706433
。 - 输出结果为:
2130706433
。
代码运行逻辑
- 输入处理:
- 通过控制台输入 IP 地址,并按
#
分割。
- 通过控制台输入 IP 地址,并按
- IP 验证:
- 验证 IP 地址格式与每部分值的范围。
- 转换逻辑:
- 转换为十六进制,拼接为完整的十六进制字符串,转为十进制。
- 输出:
- 如果 IP 地址合法,输出十进制数。
- 如果不合法,输出
"invalid IP"
。
复杂度分析
- 时间复杂度:
split("#")
分割字符串:(O(n))。- IP 每部分验证与转换为十六进制:(O(1))。
- 总复杂度为 (O(n)),其中 (n) 为输入字符串长度。
- 空间复杂度:
- 存储分割后的数组:(O(4))。
- 总复杂度为 (O(1))。
总结
这段 Java 代码主要使用正则表达式、字符串操作以及十六进制转换来实现对 IP 地址的验证及格式转换。代码逻辑清晰,易于理解,适合处理网络编程中的 IP 地址转换问题。
四、Python算法源码
这段代码是用 Python 实现的 IP 地址合法性校验及十六进制转十进制的程序。以下是代码的详细注释与讲解:
代码结构与功能概览
- 输入部分:
- 从控制台输入 IP 地址字符串。
- 核心方法
getResult
:- 验证 IP 地址是否由四部分组成。
- 验证 IP 地址的每一部分是否合法。
- 如果合法,转换为十六进制字符串,并转为十进制数字。
- 辅助方法
isValid
:- 验证 IP 地址的每一部分是否合法。
- 辅助方法
getHexString
:- 将十进制数字字符串转换为两位的十六进制字符串。
代码详细注释
输入部分
s = input()
- 功能:从标准输入读取一个字符串,并存储到变量
s
中。 - 假设输入的 IP 地址格式为
#
分隔,例如:192#168#0#1
。
辅助方法 getHexString
def getHexString(num):
tmp = hex(int(num))[2:] # 将十进制数字转换为十六进制字符串,去掉前缀 '0x'
# 如果十六进制字符串的长度为 1,则在前面补充一个 '0',确保长度为 2
if len(tmp) == 1:
tmp = "0" + tmp
return tmp
- 功能:
- 将输入的十进制数字字符串(如
"10"
)转换为两位的十六进制字符串。 - 使用 Python 内置函数
hex()
将十进制转为十六进制。
- 将输入的十进制数字字符串(如
- 示例:
- 输入:
10
- 转为十六进制:
"a"
→ 补零为"0a"
。 - 输入:
255
- 转为十六进制:
"ff"
。
- 输入:
辅助方法 isValid
def isValid(ipSub, start, end):
# 如果包含非数字字符,则返回 False
if not ipSub.isdigit():
return False
# 如果包含前导0,则返回 False
num = int(ipSub)
if str(num) != ipSub:
return False
# 检查是否在范围 [start, end] 内
return start <= num <= end
- 功能:
- 验证 IP 地址某一部分是否合法。
- 检查是否为纯数字、是否有前导零、是否在指定范围内。
- 参数:
ipSub
: 字符串格式的 IP 地址部分。start
和end
: 合法范围的起始值和结束值。
- 示例:
- 输入:
"192", 1, 128
→ 返回False
(不在范围内)。 - 输入:
"0", 0, 255
→ 返回True
。
- 输入:
核心方法 getResult
def getResult():
ip = s.split("#") # 将输入字符串按 '#' 分隔
# IP 地址必须由四部分组成,否则无效
if len(ip) != 4:
return "invalid IP"
# 验证每一部分是否合法
if not isValid(ip[0], 1, 128) or not isValid(ip[1], 0, 255) or not isValid(ip[2], 0, 255) or not isValid(ip[3], 0, 255):
return "invalid IP"
# 将每部分转换为两位十六进制字符串,并拼接为完整十六进制字符串
hexString = getHexString(ip[0]) + getHexString(ip[1]) + getHexString(ip[2]) + getHexString(ip[3])
# 使用 int() 将十六进制字符串转换为十进制整数,并返回字符串结果
return str(int(hexString, 16))
- 功能:
- 检查 IP 地址是否合法。
- 如果合法,将其转换为十六进制字符串,并转为十进制整数。
- 逻辑:
- 使用
split("#")
分割输入字符串,分成四部分。 - 检查是否有且仅有四部分,若不是,返回
"invalid IP"
。 - 调用
isValid
检查每部分是否符合范围:- 第一部分范围为
[1, 128]
。 - 其余部分范围为
[0, 255]
。
- 第一部分范围为
- 如果合法:
- 调用
getHexString
将每部分转换为两位十六进制字符串。 - 将这些字符串拼接为完整的十六进制字符串。
- 使用
int(hexString, 16)
将拼接结果当作十六进制数,转换为十进制整数。
- 调用
- 返回十进制结果的字符串形式。
- 使用
- 返回值:
- 若 IP 地址合法,返回转换后的十进制整数字符串。
- 若 IP 地址不合法,返回
"invalid IP"
。
算法调用
print(getResult())
- 功能:
- 调用
getResult
方法,输出结果到控制台。
- 调用
运行示例与解析
示例 1
输入:
127#0#0#1
解析:
- 分割结果:
["127", "0", "0", "1"]
。 - 验证:
- 第一部分
127
在[1, 128]
范围内,合法。 - 第二、三、四部分
0
在[0, 255]
范围内,合法。
- 第一部分
- 转换为十六进制:
127
→7f
0
→00
0
→00
1
→01
- 拼接十六进制字符串:
7f000001
。 - 转换为十进制:
2130706433
。
输出:
2130706433
示例 2
输入:
192#300#1#0
解析:
- 分割结果:
["192", "300", "1", "0"]
。 - 验证:
- 第二部分
300
不在[0, 255]
范围内,非法。
- 第二部分
输出:
invalid IP
示例 3
输入:
1#1#1
解析:
- 分割结果:
["1", "1", "1"]
。 - 部分数目不足 4 个,非法。
输出:
invalid IP
代码复杂度分析
-
时间复杂度:
- 分割字符串:
O(n)
,其中n
是输入字符串长度。 - 验证每部分是否合法:
O(1)
。 - 转换每部分为十六进制拼接:
O(1)
。 - 转换十六进制为十进制:
O(1)
。 - 总复杂度:
O(n)
。
- 分割字符串:
-
空间复杂度:
- 存储分割结果列表:
O(1)
(最多 4 个部分)。 - 总空间复杂度:
O(1)
。
- 存储分割结果列表:
总结
- 代码通过分割、验证和转换实现了 IP 地址的合法性校验及格式转换,非常清晰且高效。
- 使用 Python 内置方法如
hex()
和正则表达式处理,使代码更简洁。 - 支持大数的处理,不会因整型溢出导致错误。
五、C/C++算法源码:
当然,我会为你将这段 Python 代码转换为 C++ 和 C 语言版本,并添加详细的中文注释和讲解。由于 C++ 和 C 的语法相似,我将分别提供它们的版本,并解释每部分的实现。
C++ 版本
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
// 获取十进制数字符串对应的十六进制数字符串
string getHexString(const string &num) {
int number = stoi(num); // 将字符串转换为整数
stringstream ss;
ss << hex << setw(2) << setfill('0') << number; // 转为十六进制,并确保两位数
return ss.str();
}
// ip组成是否合法
bool isValid(const string &ipSub, int start, int end) {
// 如果包含非数字字符,则不合法
for (char c : ipSub) {
if (!isdigit(c)) {
return false;
}
}
// 如果包含前导0,则不合法
int num = stoi(ipSub);
if (to_string(num) != ipSub) {
return false;
}
// 如果不是规定范围,则不合法
return num >= start && num <= end;
}
// 算法入口
string getResult(const string &s) {
stringstream ss(s);
string ip;
string parts[4];
int i = 0;
// 使用 '#' 分隔IP地址
while (getline(ss, ip, '#') && i < 4) {
parts[i++] = ip;
}
// ip地址由四部分组成,少于或多于四部分都不合法
if (i != 4) return "invalid IP";
// 如果ip地址四部分某部分不合法,则ip不合法
if (!isValid(parts[0], 1, 128) || !isValid(parts[1], 0, 255) ||
!isValid(parts[2], 0, 255) || !isValid(parts[3], 0, 255)) {
return "invalid IP";
}
// 将每部分转换为十六进制字符串并拼接
string hexString = getHexString(parts[0]) + getHexString(parts[1]) +
getHexString(parts[2]) + getHexString(parts[3]);
// 将十六进制字符串转换为十进制整数
unsigned long result = stoul(hexString, nullptr, 16);
return to_string(result);
}
int main() {
string s;
cout << "请输入IP地址(使用#分隔每一部分): ";
getline(cin, s);
cout << getResult(s) << endl;
return 0;
}
C++ 代码讲解
-
函数
getHexString
:- 通过
stoi
将字符串转换为整数,然后使用stringstream
和iomanip
库将其转换为两位十六进制字符串。
- 通过
-
函数
isValid
:- 遍历字符串,检查是否为数字。
- 如果有前导零,通过比较转换后的字符串验证。
- 检查数值是否在指定范围内。
-
函数
getResult
:- 使用
stringstream
和getline
以#
分割字符串。 - 验证 IP 地址是否由四部分组成,且每部分是否合法。
- 如果合法,调用
getHexString
并拼接,每部分转换为十六进制后组合。 - 使用
stoul
将十六进制字符串转为十进制并返回。
- 使用
C 语言版本
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 获取十进制数字符串对应的十六进制数字符串
void getHexString(char *dest, const char *num) {
int number = atoi(num); // 将字符串转换为整数
sprintf(dest, "%02x", number); // 使用sprintf格式化为两位十六进制
}
// ip组成是否合法
int isValid(const char *ipSub, int start, int end) {
// 如果包含非数字字符,则不合法
for (int i = 0; ipSub[i] != '\0'; ++i) {
if (!isdigit(ipSub[i])) {
return 0;
}
}
// 如果包含前导0,则不合法
int num = atoi(ipSub);
char numStr[12];
sprintf(numStr, "%d", num);
if (strcmp(numStr, ipSub) != 0) {
return 0;
}
// 如果不是规定范围,则不合法
return num >= start && num <= end;
}
// 算法入口
const char* getResult(const char *s) {
char ip[4][12];
int part = 0;
char *token;
char s_copy[100];
strcpy(s_copy, s);
// 使用 '#' 分隔IP地址
token = strtok(s_copy, "#");
while (token != NULL && part < 4) {
strcpy(ip[part++], token);
token = strtok(NULL, "#");
}
// ip地址由四部分组成,少于或多于四部分都不合法
if (part != 4) return "invalid IP";
// 如果ip地址四部分某部分不合法,则ip不合法
if (!isValid(ip[0], 1, 128) || !isValid(ip[1], 0, 255) ||
!isValid(ip[2], 0, 255) || !isValid(ip[3], 0, 255)) {
return "invalid IP";
}
// 将每部分转换为十六进制字符串并拼接
char hexString[9] = "";
char hexPart[3];
for (int i = 0; i < 4; ++i) {
getHexString(hexPart, ip[i]);
strcat(hexString, hexPart);
}
// 将十六进制字符串转换为十进制整数
unsigned long decimal = strtoul(hexString, NULL, 16);
static char result[20];
sprintf(result, "%lu", decimal);
return result;
}
int main() {
char s[100];
printf("请输入IP地址(使用#分隔每一部分): ");
fgets(s, sizeof(s), stdin);
s[strcspn(s, "\n")] = 0; // 去除换行符
printf("%s\n", getResult(s));
return 0;
}
C 代码讲解
-
函数
getHexString
:- 使用
atoi
将字符串转换为整数,sprintf
函数格式化为两位的十六进制字符串。
- 使用
-
函数
isValid
:- 逐字符检查字符串是否为数字。
- 使用
atoi
和sprintf
进行前导零检查。 - 检查是否在
[start, end]
范围内。
-
函数
getResult
:- 使用
strtok
分割字符串,存入ip
数组中。 - 验证是否有且仅有四部分,并检查每部分是否合法。
- 调用
getHexString
将每部分转换为十六进制字符串并拼接。 - 使用
strtoul
将拼接后十六进制字符串转换为十进制数字。
- 使用
总结
- C++ 与 C 的区别:C++ 使用了 STL 和字符串类来简化字符串处理,而 C 语言需要使用字符数组和指针处理字符串。
- C++ 的优势:使用
stringstream
处理字符串更为直观和方便。 - C 的优势:更接近底层,代码执行效率可能更高,但代码编写相对复杂。
- 应用场景:了解这两种实现,可以根据具体项目需求选择合适的编程语言进行实现。
六、尾言
什么是华为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 或监考人员进行反馈。
祝你考试顺利,取得理想成绩!
原文地址:https://blog.csdn.net/m0_63168877/article/details/145178531
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!