【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%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

今天 15:58
已编辑
四平职业大学 Java
持续更新中...现在快11月中旬了,&nbsp;秋招基本结束了,&nbsp;在此做个总结.整个秋招从8月份开始,&nbsp;大概持续3个月.平均每天一面/笔试,&nbsp;差不多.&nbsp;共面试了&nbsp;100&nbsp;场应该是有的,&nbsp;每场面试内容我都总结放到牛客了,&nbsp;也因此收到了牛客官方的现金/礼品奖励,&nbsp;非常感谢!我的方法论是:&nbsp;面试录音(bandicam或者ev录屏)&nbsp;-&gt;&nbsp;mp3&nbsp;音频(只录声音)&nbsp;-&gt;&nbsp;阿里听悟&nbsp;-&gt;&nbsp;文字&nbsp;-&gt;&nbsp;LLM&nbsp;-&gt;&nbsp;总结内容.prompt&nbsp;大概是&nbsp;总结面试题目,&nbsp;去除个人隐私信息.虽然没实习也能找到工作,&nbsp;但感觉实习还是非常重要的.&nbsp;&nbsp;没有相关的垂直经验,&nbsp;是非常吃亏的.各位本科生,研究生应该在入学之前就做好打算,&nbsp;此处不多展开,&nbsp;经历过才知道这里面的血与泪.😁意向的/开奖的:所有开奖的我都分享到&nbsp;*********&nbsp;上了,&nbsp;此处我仅分享总包(首个完整年税前总包,&nbsp;不含公积金,&nbsp;不含政府补贴,&nbsp;不考虑试用期打折)-&nbsp;OPPO总包&nbsp;&nbsp;36W&nbsp;+&nbsp;房补&nbsp;1.44W-&nbsp;影石&nbsp;Insta360总包&nbsp;48W-&nbsp;601&nbsp;扬州总包&nbsp;18W-&nbsp;飞腾总包&nbsp;23-26&nbsp;W-&nbsp;网易雷火总包&nbsp;44.8W&nbsp;+&nbsp;签字费3W&nbsp;+&nbsp;项目分红(这项应该有不少)-&nbsp;京东总包&nbsp;52W零售开发白菜如果你觉得能拿满20薪,就这么多.至于能不能拿满,&nbsp;我不清楚,&nbsp;不了解.&nbsp;不过,&nbsp;保底应该是有14薪.-&nbsp;小红书总包&nbsp;52.8W&nbsp;+&nbsp;3W签字&nbsp;+&nbsp;1000股期权-&nbsp;蚂蚁&nbsp;oceanbase-&nbsp;钉钉-&nbsp;哔哩哔哩-&nbsp;美团-&nbsp;Shopee😐还在泡的:-&nbsp;百度OFFER评估中...-&nbsp;快手一直在录用评估...-&nbsp;携程英语测评完就没消息了...-&nbsp;网易互娱HR面完没消息&nbsp;...-&nbsp;阿里云HR面完没消息,&nbsp;应该淹死了.😑已经G了的:-&nbsp;腾讯秋招一战&nbsp;TEG&nbsp;什么架构师专项,&nbsp;死在技术终面.二战&nbsp;WXG&nbsp;客户端(被捞的),&nbsp;三面过了,&nbsp;主动发邮件结束流程了.-&nbsp;字节面了4个组,&nbsp;前三个组均二面挂.但HR挺好的,&nbsp;会积极的帮助寻找合适岗位,&nbsp;岗位都是被捞的.最后一个组约二面,&nbsp;我拒绝了,&nbsp;不想面了.感觉字节是比较在意垂直经历的,&nbsp;HR给我反馈的面评是:&nbsp;基础,&nbsp;沟通能力还是不错的,&nbsp;但是相关项目理解比较欠缺.还有些笔/面试挂的,&nbsp;以及我不想面的,&nbsp;就不赘述了.感谢所有给予机会的公司!&nbsp;&nbsp;白菜不白菜的,&nbsp;都是棵菜.个人觉得,&nbsp;和非计算机专业的比,&nbsp;收入情况还是比较乐观的.当初选择学计算机,&nbsp;还是没有选错的.最后,祝大家都能拿到心仪的offer&nbsp;!为祖国,&nbsp;健康工作五十年&nbsp;!为自己,&nbsp;幸福生活一辈子&nbsp;!
今年秋招还有金九银十吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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