LeetCode 题解工作台
验证IP地址
给定一个字符串 queryIP 。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。 有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 i 且 x i 不能…
1
题型
6
代码语言
3
相关题
当前训练重点
中等 · String-driven solution strategy
答案摘要
我们可以定义两个函数 `isIPv4` 和 `isIPv6` 来判断一个字符串是否是有效的 IPv4 地址和 IPv6 地址。 函数 `isIPv4` 的实现如下:
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 String-driven solution strategy 题型思路
题目描述
给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。
有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “192.168@1.1” 为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中:
1 <= xi.length <= 4xi是一个 十六进制字符串 ,可以包含数字、小写英文字母('a'到'f')和大写英文字母('A'到'F')。- 在
xi中允许前导零。
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334" 和 "2001:db8:85a3:0:0:8A2E:0370:7334" 是有效的 IPv6 地址,而 "2001:0db8:85a3::8A2E:037j:7334" 和 "02001:0db8:85a3:0000:0000:8a2e:0370:7334" 是无效的 IPv6 地址。
示例 1:
输入:queryIP = "172.16.254.1" 输出:"IPv4" 解释:有效的 IPv4 地址,返回 "IPv4"
示例 2:
输入:queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334" 输出:"IPv6" 解释:有效的 IPv6 地址,返回 "IPv6"
示例 3:
输入:queryIP = "256.256.256.256" 输出:"Neither" 解释:既不是 IPv4 地址,又不是 IPv6 地址
提示:
queryIP仅由英文字母,数字,字符'.'和':'组成。
解题思路
方法一:模拟
我们可以定义两个函数 isIPv4 和 isIPv6 来判断一个字符串是否是有效的 IPv4 地址和 IPv6 地址。
函数 isIPv4 的实现如下:
- 我们首先判断字符串
s是否以.结尾,如果是的话,说明s不是一个有效的 IPv4 地址,直接返回false。 - 然后我们将字符串
s以.分割成一个字符串数组ss,如果ss的长度不等于4,说明s不是一个有效的 IPv4 地址,直接返回false。 - 对于数组
ss中的每个字符串t,我们判断:- 如果
t的长度大于1且t的第一个字符是0,说明t不是一个有效的 IPv4 地址,直接返回false。 - 如果
t不是一个数字或者t不在0到255的范围内,说明t不是一个有效的 IPv4 地址,直接返回false。
- 如果
- 如果上述条件都不满足,说明
s是一个有效的 IPv4 地址,返回true。
函数 isIPv6 的实现如下:
- 我们首先判断字符串
s是否以:结尾,如果是的话,说明s不是一个有效的 IPv6 地址,直接返回false。 - 然后我们将字符串
s以:分割成一个字符串数组ss,如果ss的长度不等于8,说明s不是一个有效的 IPv6 地址,直接返回false。 - 对于数组
ss中的每个字符串t,我们判断:- 如果
t的长度小于1或大于4,说明t不是一个有效的 IPv6 地址,直接返回false。 - 如果
t中的字符不全是0到9和a到f(不区分大小写),说明t不是一个有效的 IPv6 地址,直接返回false。
- 如果
- 如果上述条件都不满足,说明
s是一个有效的 IPv6 地址,返回true。
最后,我们调用 isIPv4 和 isIPv6 函数判断 queryIP 是不是一个有效的 IPv4 地址或 IPv6 地址,如果都不是,返回 Neither。
时间复杂度 ,空间复杂度 。其中 为字符串 queryIP 的长度。
class Solution:
def validIPAddress(self, queryIP: str) -> str:
def is_ipv4(s: str) -> bool:
ss = s.split(".")
if len(ss) != 4:
return False
for t in ss:
if len(t) > 1 and t[0] == "0":
return False
if not t.isdigit() or not 0 <= int(t) <= 255:
return False
return True
def is_ipv6(s: str) -> bool:
ss = s.split(":")
if len(ss) != 8:
return False
for t in ss:
if not 1 <= len(t) <= 4:
return False
if not all(c in "0123456789abcdefABCDEF" for c in t):
return False
return True
if is_ipv4(queryIP):
return "IPv4"
if is_ipv6(queryIP):
return "IPv6"
return "Neither"
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | complexity is (\mathcal{O}(N)) since each character of the string is examined once. Space complexity is (\mathcal{O}(1)) ignoring the split segments array, as only fixed-size checks are used per segment. |
| 空间 | \mathcal{O}(1) |
面试官常问的追问
外企场景- question_mark
Expect clear string parsing and segment-by-segment validation.
- question_mark
Watch for handling of leading zeros and range violations in IPv4 segments.
- question_mark
Look for proper hexadecimal checks and correct segment count in IPv6 addresses.
常见陷阱
外企场景- error
Allowing leading zeros in IPv4 segments, e.g., '01' incorrectly accepted.
- error
Failing to check that each IPv6 segment has at most four hexadecimal digits.
- error
Mixing IPv4 and IPv6 separators, or miscounting the number of segments.
进阶变体
外企场景- arrow_right_alt
Validate only IPv4 addresses, skipping IPv6 checks.
- arrow_right_alt
Validate only IPv6 addresses, skipping IPv4 checks.
- arrow_right_alt
Detect shorthand IPv6 formats with omitted zeros, extending the standard rules.