验证IP地址
难度:
标签:
题目描述
给定一个字符串 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”
、 “[email protected]”
为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8”
的IP地址,其中:
1 <= xi.length <= 4
xi
是一个 十六进制字符串 ,可以包含数字、小写英文字母('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
仅由英文字母,数字,字符'.'
和':'
组成。
代码结果
运行时间: 24 ms, 内存: 0.0 MB
/*
思路:
1. 使用Java Stream流处理,首先检查是否包含"."或":"来判断是否为IPv4或IPv6。
2. 对于IPv4,使用stream对每个部分进行过滤和验证。
3. 对于IPv6,使用stream对每个部分进行过滤和验证。
*/
import java.util.Arrays;
public class Solution {
public String validIPAddress(String queryIP) {
if (queryIP.chars().filter(ch -> ch == '.').count() == 3) {
return Arrays.stream(queryIP.split("\\."))
.filter(part -> part.matches("[0-9]{1,3}") && Integer.parseInt(part) >= 0 && Integer.parseInt(part) <= 255 && !(part.length() > 1 && part.charAt(0) == '0'))
.count() == 4 ? "IPv4" : "Neither";
} else if (queryIP.chars().filter(ch -> ch == ':').count() == 7) {
return Arrays.stream(queryIP.split(":"))
.filter(part -> part.matches("[0-9a-fA-F]{1,4}"))
.count() == 8 ? "IPv6" : "Neither";
}
return "Neither";
}
}
解释
方法:
这个题解的思路是分别判断给定的字符串是否为有效的IPv4地址或IPv6地址。对于IPv4地址,先判断字符串中'.'的数量是否为3,然后对用'.'分割的每一段进行判断,要求每一段都能转换为0-255之间的整数且转换后的字符串与原字符串相等(以避免01这样的情况)。对于IPv6地址,先判断字符串中':'的数量是否为7,然后对用':'分割的每一段进行判断,要求每一段为1-4个字符,且能转换为非负的16进制整数。如果既不满足IPv4也不满足IPv6的条件,就返回'Neither'。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
题解中对IPv4地址的有效性检查,为什么要确保转换为整数后的字符串与原字符串相等?
▷🦆
在判断字符串是否为有效的IPv6地址时,你是如何确定一个字符串是有效的十六进制数?
▷🦆
IPv6地址中每一部分的长度限制为1到4个字符,这个长度限制是如何影响地址的有效性的?
▷🦆
题解提到对字符串使用split操作,这个操作在处理异常输入(如连续的分隔符)时会有什么效果?
▷