【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

解题思路:

  1. 使用分隔符#将输入的IP地址分割成4个部分
  2. 检查是否存在非法情况:
    • IP地址不是由4部分组成
    • 部分包含非数字字符
    • 部分包含前导零(如"01")
    • 第一部分的数值不在1~128范围内
    • 其他部分的数值不在0~255范围内
  3. 如果IP合法,将每个部分转换为16进制字符串,确保每部分占两位(不足前面补0)
  4. 将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%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务