【2025刷题笔记】- IPv4地址转换成整数
刷题笔记合集🔗
IPv4地址转换成整数
问题描述
存在一种虚拟IPv4地址,由4小节组成,每节的范围为0~255,以#号间隔,虚拟IPv4地址可以转换为一个32位的整数。例如:
- 128#0#255#255,转换为32位整数的结果为2147549183(0x8000FFFF)
- 1#0#0#0,转换为32位整数的结果为16777216(0x01000000)
现以字符串形式给出一个虚拟IPv4地址,限制第1小节的范围为1128,即每一节范围分别为(1128)#(0255)#(0255)#(0~255),要求每个IPv4地址只能对应到唯一的整数上。
如果是非法IPv4,返回invalid IP。
输入格式
输入一行,虚拟IPv4地址格式字符串。
输出格式
输出一行,按照要求输出整型或者特定字符。
样例输入
100#101#1#5
1#2#3
样例输出
1684340997
invalid IP
数据范围
输入不能确保是合法的IPv4地址,需要对非法IPv4进行识别,返回特定错误。非法IPv4包括:
- 空串
- 含有IP地址中不存在的字符
- 非合法的#分隔十进制
- 十进制整数不在合法区间内
- 含有前导0的整数(如01#2#3#4)
| 样例 | 解释说明 |
|---|---|
| 样例1 | 输入100#101#1#5是合法的IPv4地址,转换成整数为1684340997 |
| 样例2 | 输入1#2#3不符合IPv4的格式要求(只有3段而不是4段),所以输出invalid IP |
题解
这道题目要求我们将一个特殊格式的IPv4地址(使用#号分隔而不是常规的点分隔)转换为一个32位整数,同时处理各种可能的非法输入情况。
首先明确一下IPv4地址转换为整数的原理:IPv4地址由4个字节组成,将这4个字节按照从左到右的顺序依次放入32位整数的对应位置。例如:
100#101#1#5转换过程如下:
- 100的十六进制表示为64
- 101的十六进制表示为65
- 1的十六进制表示为01
- 5的十六进制表示为05
- 将它们连接起来:64650105,转换为十进制就是1684340997
解题思路:
- 使用分隔符#将输入的IP地址分割成4个部分
- 检查是否存在非法情况:
- IP地址不是由4部分组成
- 部分包含非数字字符
- 部分包含前导零(如"01")
- 第一部分的数值不在1~128范围内
- 其他部分的数值不在0~255范围内
- 如果IP合法,将每个部分转换为16进制字符串,确保每部分占两位(不足前面补0)
- 将4个部分的16进制字符串连接起来,转换为10进制整数
针对不同的非法情况,我们需要有对应的检查:
- 对于IP地址部分数量不是4的情况,直接判断分割后的数组长度
- 对于非数字字符和数值范围的检查,可以通过正则表达式或直接数值比较实现
- 对于前导零的检查,可以将字符串转为数字后再转回字符串比较,不同则说明有前导零
最终,如果检查通过,计算并返回转换后的整数;如果检查不通过,返回"invalid IP"。
时间复杂度:O(1),因为IP地址始终是固定长度的。 空间复杂度:O(1),使用的额外空间也是常数级别。
参考代码
- Python
import sys
input = lambda:sys.stdin.readline().strip()
# 输入获取
ip_str = input()
# 获取十进制数对应的十六进制字符串(不足两位补0)
def get_hex_str(num):
hex_val = hex(int(num))[2:] # 去掉0x前缀
# 补足前导0,确保是两位
if len(hex_val) == 1:
hex_val = "0" + hex_val
return hex_val
# 检查IP段是否合法
def is_valid(ip_seg, min_val, max_val):
# 检查是否只包含数字
if not ip_seg.isdigit():
return False
# 检查是否有前导0(如"01")
num = int(ip_seg)
if str(num) != ip_seg:
return False
# 检查是否在有效范围内
return min_val <= num <= max_val
# 算法实现
def process_ip():
# 用#分割IP地址
segments = ip_str.split("#")
# IP必须由4部分组成
if len(segments) != 4:
return "invalid IP"
# 检查每个部分是否合法
if (not is_valid(segments[0], 1, 128) or
not is_valid(segments[1], 0, 255) or
not is_valid(segments[2], 0, 255) or
not is_valid(segments[3], 0, 255)):
return "invalid IP"
# 将4部分转为16进制并连接
hex_str = ""
for i in range(4):
hex_str += get_hex_str(segments[i])
# 将16进制转为10进制整数
return str(int(hex_str, 16))
# 输出结果
print(process_ip())
- Cpp
#include <bits/stdc++.h>
using names
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记
