一、题目描述
存在一种虚拟 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 地址, 需要对非法 IPv4(空串,含有 IP 地址中不存在的字符, 非合法的#分十进制,十进制整数不在合法区间内)进行识别,返回特定错误
二、输入描述
输入一行,虚拟 IPv4 地址格式字符串。
三、输出描述
输出以上,按照要求输出整型或者特定字符。
四、解题思路
- 读取输入的虚拟 IPv4 地址字符串,使用split方法将其按照"#"进行拆分,得到一个字符串数组arr,数组长度为4;
- 初始化变量count为0,用于记录转换后的32位整数;
- 初始化布尔变量flag为true,用于判断地址的合法性;
- 判断arr的长度是否为4,如果不为4,则将flag置为false;。
- 遍历arr数组,对每个字符串进行以下操作;
- 将字符串转换为整数n。
- 判断当前位置是否为第1小节(索引为0),如果是,则判断n是否在合法范围1~128之间,如果不是,则将flag置为false。
- 判断n是否在合法范围0~255之间,如果不是,则将flag置为false。
- 将n左移相应的位数(8*(3-i))并累加到count中。
- 根据flag的值判断地址的合法性,如果为true,则输出count;如果为false,则输出"invalid IP"。
该算法通过将虚拟 IPv4 地址转换为32位整数的方式进行处理,并同时判断地址的合法性。根据题目要求的范围限制和条件判断,遍历地址的每一节,将每一节的值转换为32位整数的对应位,并累加到count中。最后根据flag的值判断地址的合法性,并输出相应的结果。算法的时间复杂度为O(1),因为地址的长度固定为4。
五、JavaScript算法源码
function calculate(input) {
if (!input) {
console.log('invalid IP'); // 空串属于非法 IPv4 地址
} else {
const arr = input.split('#'); // 将地址按照"#"进行拆分,得到一个字符串数组arr,数组长度为4
if (arr.length !== 4) { // 地址格式不正确,属于非法 IPv4 地址
console.log('invalid IP');
} else {
let count = 0; // 初始化变量count为0,用于记录转换后的32位整数
let flag = true; // 初始化布尔变量flag为true,用于判断地址的合法性
for (let i = 0; i < 4; i++) { // 遍历arr数组,对每个字符串进行处理
const n = parseInt(arr[i]); // 将当前字符串转换为整数n
if (isNaN(n) || n < 0 || n > 255) { // 非法十进制整数,属于非法 IPv4 地址
flag = false;
break;
}
if (i === 0 && (n < 1 || n > 128)) { // 第1小节范围不符合要求,属于非法 IPv4 地址
flag = false;
break;
}
count |= n << (8 * (3 - i)); // 将n左移相应的位数并累加到count中
}
if (flag) { // 地址合法,输出32位整数count
return count;
} else { // 地址非法,输出"invalid IP"
console.log('invalid IP');
}
}
}
}
六、效果展示
1、输入
10#20#30#40
2、输出
169090600
🏆下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。