题目描述
存在一种虚拟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地址,需要对非法IPv4(空串,含有IP地址中不存在的字符,非合法的#分十进制,十进制整数不在合法区间内)进行识别,返回特定错误
用例
输入 | 100#101#1#5 |
输出 | 1684340997 |
说明 | 无 |
输入 | 1#2#3 |
输出 | invalid IP |
说明 | 无 |
题目解析
本题主要注意异常情况的处理,有如下几种异常情况:
- IPv4存在空串,比如1##3#4
- IPv4存在非法字符,比如a#b#c#d
- IPv4组成部分不足,比如1#2#3
- IPv4组成部分的十进制整数,不再合法区间内,比如255#255#255#255
其中,对于存在非法字符的情况,可以转整型时抛出异常的捕获流程中处理。
2023.05.24
本题的Java语言需要注意,最后输出的数可能会超出int类型,因此需要使用Long.parseLong
2023.06.06
如果ip地址如下:
01#01#01#01
应该也要算作非法
Java算法源码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(getResult(sc.nextLine()));
}
public static String getResult(String s) {
String[] ip = s.split("#");
// ip地址由四部分组成,少于或多于四部分都不合法
if (ip.length != 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";
}
// 这里需要转为long,某些情况使用int会整型溢出
return Long.parseLong(
getHexString(ip[0]) + getHexString(ip[1]) + getHexString(ip[2]) + getHexString(ip[3]),
16)
+ "";
}
// ip组成是否合法
public static boolean isValid(String s, int from, int to) {
// 如果包含非数字字符,则不合法
if (!s.matches("^\d+$")) return false;
// 如果包含前导0,则不和法,如012
int num = Integer.parseInt(s);
if (!s.equals(num + "")) return false;
// 如果不是规定范围,则不合法
return num >= from && num <= to;
}
// 获取十进制数字符串对应的十六进制数字符串
public static String getHexString(String num) {
String hexStr = Integer.toHexString(Integer.parseInt(num));
// 补足前导0
if (hexStr.length() < 2) hexStr = "0" + hexStr;
return hexStr;
}
}
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
console.log(getResult(line));
});
function getResult(s) {
const ip = s.split("#");
// ip地址由四部分组成,少于或多于四部分都不合法
if (ip.length != 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";
}
// JS的数值安全范围最大时2^53,因此不用担心整型溢出问题
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;
// 如果包含前导0,则不和法,如012
const num = parseInt(s);
if (num + "" != s) return false;
// 如果不是规定范围,则不合法
return num >= from && num <= to;
}
// 获取十进制数字符串对应的十六进制数字符串
function getHexStr(s) {
let hexStr = parseInt(s).toString(16);
// 补足前导0
if (hexStr.length < 2) hexStr = "0" + hexStr;
return hexStr;
}
Python算法源码
# 输入获取
s = input()
# 获取十进制数字符串对应的十六进制数字符串
def getHexString(num):
tmp = hex(int(num))[2:]
# 补足前导0
if len(tmp) == 1:
tmp = "0" + tmp
return tmp
# ip组成是否合法
def isValid(ipSub, start, end):
# 如果包含非数字字符,则不合法
if not ipSub.isdigit():
return False
# 如果包含前导0,则不和法,如012
num = int(ipSub)
if str(num) != ipSub:
return False
# 如果不是规定范围,则不合法
return start <= num <= end
# 算法入口
def getResult():
ip = s.split("#")
# ip地址由四部分组成,少于或多于四部分都不合法
if len(ip) != 4:
return "invalid IP"
# 如果ip地址四部分某部分不合法,则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"
# python支持大数,不需要担心整型溢出
return str(int(getHexString(ip[0]) + getHexString(ip[1]) + getHexString(ip[2]) + getHexString(ip[3]), 16))
# 算法调用
print(getResult())
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0