通过率 39% · 提交 672 · 通过 264
小慕在开发一个网络协议模拟器时,遇到了一种虚拟IPv4地址格式。这种地址由4小节组成,第一小节的范围是1-128,其余三节的范围为0-255,各小节之间用#号分隔,格式如下: (1~128)#(0~255)#(0~255)#(0~255) 例如: 128#0#255#255,转换为的结果为2147549183() 1#0#0#0,转换为32位整数的结果为16777216(0x01000000) 小慕需要利用这个特性,将给定的虚拟IPv4地址字符串转换为一个唯一的32位整数。每个虚拟IPv4地址只能对应到唯一的整数上。如果输入的地址是非法格式,则输出字符串"invalid IP"。
这类题属于华为 OD 机考真题方向中「100分 / 数学」方向的高频题型,通常考察对「100分 / 数学」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入一行,虚拟IPv4地址格式字符串
输出一行,按照要求输出整型或者特定字符
示例 1
输入示例
100#101#1#5
输出示例
1684340997
示例 2
输入示例
1#2#3
输出示例
invalid IP
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题涉及的进制转换和 Python 内置函数的知识可查看 算法题中常用数学概念、公式、方法汇总 和 Python 常用内置函数、方法、技巧汇总 相关内容。
对于输入的原字符串 s,我们可以很方便地使用 split() 方法,以 "#" 为分隔符,将其分割为一个字符串列表 IPv4_lst。然后对 IPv4_lst 考虑以下特殊情况:
IPv4_lst 长度不为 4IPv4_lst 中存在某一个字符串,不是纯数字IPv4_lst[0] 即第一小节的取值范围不是 1-128IPv4_lst[1]、IPv4_lst[2]、IPv4_lst[3] 即第二、三、四小节的取值范围不是 0-255如果满足以上任何一种情况,输入均是一个 非法字符,应该输出 "invalid IP"。对应代码:
对于一个合法的输入,我们需要理解将 IPv4 地址转换为整数是一个怎么样的过程,再将抽象的过程翻译成代码即可。属于一道非常纯粹的 模拟题。
以 128#0#255#255 转为 2147549183(0x8000ffff)为例,其过程如下:
1. 以 # 为分隔符,将原输入字符串分割为四个小节,为 4 个十进制数整数,即 IPv4_lst = ["128", "0", "255", "255"]。
2. 每个十进制整数都可以转换为一个 两位的十六进制整数,即 ["80", "00", "ff", "ff"]。 十进制的 128、0、255、255 分别对应十六进制的 80、00、ff、ff。 之所以是两位的十六进制整数,是因为取值范围(0-255)的最大值,十进制的 255 = 16 * 16 - 1,等于十六进制的 "ff",最多为两位。 直接使用 hex() 内置函数对原十进制数进行转换,将得到一个形如 "0xFF" 的字符串,其中前缀 "0x" 表示这是一个十六进制数。在这里需要使用 切片 对 "0x" 进行去除。 如果原十进制数小于 16,那么转换后的数字位数为 1,需要在前面补一个 "0",才能使得其十六进制数的位数保持为 2。譬如十进制的 15,其十六进制为 "f",位数为 1 位,需要在前面补一个 "0" 将其变成 "0f"。
3. 将上述的 4 个两位的十六进制整数进行拼接,得到一个 八位的十六进制数 "8000FFFF"。
4. 将这个八位的十六进制数转化为十进制整数,得到答案 2147549183。
把所有代码组织在一起就是答案了。
复杂度分析 设输入字符串长度为 L(合法输入至多十几个字符)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有