LeetCode 上的第 468 题 “Validate IP Address” 要求编写一个函数来验证给定的字符串是否是有效的 IPv4 或 IPv6 地址。IPv4 地址由四个十进制数字组成,每个数字介于 0 到 255 之间,用点(.
)分隔。IPv6 地址由八个十六进制数字组成,用冒号(:
)分隔。
题目描述
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。
示例
示例 1:
输入: "172.16.254.1"
输出: "IPv4"
解释: 这是一个有效的 IPv4 地址, 所以返回 "IPv4"。
示例 2:
输入: "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出: "IPv6"
解释: 这是一个有效的 IPv6 地址, 所以返回 "IPv6"。
示例 3:
输入: "256.256.256.256"
输出: "Neither"
解释: 这不是一个有效的 IPv4 或 IPv6 地址, 所以返回 "Neither"。
解题思路
-
判断基础格式:
- 如果字符串包含点(
.
),则可能是 IPv4 地址。 - 如果字符串包含冒号(
:
),则可能是 IPv6 地址。
- 如果字符串包含点(
-
验证 IPv4 地址:
- 按点(
.
)分割字符串,应该得到四个部分。 - 每个部分必须是介于 0 到 255 之间的十进制数。
- 每个部分不能有前导零。
- 按点(
-
验证 IPv6 地址:
- 按冒号(
:
)分割字符串,应该得到八个部分。 - 每个部分必须是 1 到 4 位的十六进制数。
- 按冒号(
代码实现
以下是 Python 实现的示例代码:
class Solution:
def validIPAddress(self, IP: str) -> str:
def isIPv4(s):
parts = s.split('.')
if len(parts) != 4:
return False
for part in parts:
if not part.isdigit() or not 0 <= int(part) <= 255:
return False
if part != str(int(part)): # 检查是否有前导零
return False
return True
def isIPv6(s):
parts = s.split(':')
if len(parts) != 8:
return False
for part in parts:
if len(part) == 0 or len(part) > 4:
return False
for char in part:
if not (char.isdigit() or 'a' <= char.lower() <= 'f'):
return False
return True
if isIPv4(IP):
return "IPv4"
elif isIPv6(IP):
return "IPv6"
else:
return "Neither"
示例使用
sol = Solution() print(sol.validIPAddress("172.16.254.1")) # 输出: "IPv4" print(sol.validIPAddress("2001:0db8:85a3:0:0:8A2E:0370:7334")) # 输出: "IPv6" print(sol.validIPAddress("256.256.256.256")) # 输出: "Neither"
详细解释
-
isIPv4 函数:
- 使用
split('.')
将字符串按点分割。 - 检查分割后的部分数量是否为 4。
- 对每个部分进行以下检查:
- 是否为数字。
- 转换为整数后是否在 0 到 255 范围内。
- 去除前导零后是否与原字符串相同。
- 使用
-
isIPv6 函数:
- 使用
split(':')
将字符串按冒号分割。 - 检查分割后的部分数量是否为 8。
- 对每个部分进行以下检查:
- 长度是否在 1 到 4 之间。
- 每个字符是否为数字或十六进制字符(a-f 或 A-F)。
- 使用
-
主函数 validIPAddress:
- 调用
isIPv4
和isIPv6
函数进行验证,根据结果返回 “IPv4″、”IPv6” 或 “Neither”。
- 调用
通过这种方式,可以有效地验证给定的字符串是否是有效的 IP 地址,并返回相应的结果。
发表回复