持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
题目描述
给定一个字符串 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 <= 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 地址。
示例
输入: queryIP = "172.16.254.1"
输出: "IPv4"
解释: 有效的 IPv4 地址,返回 "IPv4"
输入:queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出:"IPv6"
解释:有效的 IPv6 地址,返回 "IPv6"
输入: queryIP = "256.256.256.256"
输出: "Neither"
解释: 既不是 IPv4 地址,又不是 IPv6 地址
提示
queryIP
仅由英文字母,数字,字符'.'
和':'
组成。
模拟
判断字符串中是否有ip地址对应的符号,再分别进行规则判断。
- 字符串中有
.
,走IPv4的校验规则 - 字符串中有
:
,走IPv6的校验规则 - 其余直接返回
“Neither”
class Solution {
public String validIPAddress(String queryIP) {
if(queryIP.indexOf(".") > 0 && checkIp4(queryIP)) return "IPv4";
if(queryIP.indexOf(":") > 0 && checkIp6(queryIP)) return "IPv6";
return "Neither";
}
private boolean checkIp4(String queryIP){
String[] ipStr = queryIP.split("\\.", -1);
if(ipStr.length != 4){
return false;
}
try{
for(String ip : ipStr){
if(Integer.parseInt(ip) > 255 || (ip.charAt(0) == '0' && ip.length() > 1)){
return false;
}
}
}catch(Exception e){
return false;
}
return true;
}
private boolean checkIp6(String queryIP){
int n = queryIP.length(), cnt = 0;
char[] cs = queryIP.toCharArray();
for (int i = 0; i < n && cnt <= 7; ) {
int j = i;
while (j < n && ((cs[j] >= 'a' && cs[j] <= 'f') || (cs[j] >= 'A' && cs[j] <= 'F') || (cs[j] >= '0' && cs[j] <= '9'))) j++;
// 非 item 字符之间没有 item 或 长度超过 4
if (i == j || j - i > 4) return false;
i = j + 1;
if (j == n) continue;
// 存在除 : 以外的其他非数字字符
if (cs[j] != ':') return false;
cnt++;
}
// 恰好存在 7 个不位于两端的 :
return cnt == 7 && cs[0] != ':' && cs[n - 1] != ':';
}
}