一、题目描述
存在一种虚拟 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。
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] arr = sc.nextLine().split("#");
int len = arr.length;
long count = 0;
boolean flag = true;
if(len==4){
for(int i=0;i<len;i++){
long n = Integer.valueOf(arr[i]);
if(i==0 && (n<1 || n>128)){
flag = false;
break;
}else if(n<0 || n>255){
flag = false;
break;
}
/**
* 1、使用把IP地址分成4个数字: 128 199 231 44
* 2、把每个数字转换为2进制
* 3、如果转换后这个数字对应的二进制数不够8位,在左侧补0: 10000000 11000111 11100111 00101100
*/
count += n<<(8*(3-i));
}
}else {
flag = false;
}
if(flag){
System.out.println(count);
}else {
System.out.println("invalid IP");
}
}
六、效果展示
输入10#20#30#40
输出169090600
🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。