示例 1: 输入:IP = "172.16.254.1" 输出:"IPv4" 解释:有效的 IPv4 地址,返回 "IPv4" 示例 2: 输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334" 输出:"IPv6" 解释:有效的 IPv6 地址,返回 "IPv6" 示例 3: 输入:IP = "256.256.256.256" 输出:"Neither" 解释:既不是 IPv4 地址,又不是 IPv6 地址思路
模拟 + 先框架再细节
- 本题直接模拟,先搭建出整体框架,检查IPv4和检查IPv6,再对各种不合法情况检查
- indexOf()方法,查找某个字符所在下标的位置,如果不存在就是-1。 Split()方法,分割,注意这里.需要加上转移字符,又由于也要转义,所以就是.,作用就是. :不需要转义
- 细节:split分割,要考虑末尾是.的情况,比如IPv4这种情况长度也是4
- 如果不让使用split,要自己实现的话,可以用双指针来“截取”,先将原字符末尾加上分割符号,便于统一处理
class Solution {
private String checkIPv4(String IP) {
//以.分割要用转义字符, 然后本身也要加来转义, \.作用就是.
String items[] = IP.split("\.");
//如果不是4项,或者末尾还有.,因为如果末尾有. ,split分割出来也是4项
if (items.length != 4 || IP.charAt(IP.length() - 1) == '.') {
return "Neither";
}
for (String item: items) {
//如果该项为空,或者长度大于3, 不合法
if (item.isEmpty() || item.length() > 3) {
return "Neither";
}
//如果含有前导0,不合法
if (item.length() > 1 && item.charAt(0) == '0') {
return "Neither";
}
for (char c: item.toCharArray()) {
//如果字符不是0~9,不合法
if (c < '0' || c > '9') return "Neither";
}
//如果都是0~9,计算出对应的数字看是小于等于255
int num = Integer.parseInt(item);
if (num > 255) return "Neither";
}
return "IPv4";
}
private String checkIPv6(String IP) {
String items[] = IP.split(":");
if (items.length != 8 || IP.charAt(IP.length() - 1) == ':') {
return "Neither";
}
for (String item: items) {
if (item.isEmpty() || item.length() > 4) {
return "Neither";
}
for (char c: item.toCharArray()) {
//检查字符是否符合0~9,a~f或者A~F
if (!check(c)) {
return "Neither";
}
}
}
return "IPv6";
}
public boolean check(char c) {
if (c >= '0' && c <= '9') return true;
if (c >= 'a' && c <= 'f') return true;
if (c >= 'A' && c <= 'F') return true;
return false;
}
public String validIPAddress(String queryIP) {
//:和.都存在
if (queryIP.indexOf('.') != -1 && queryIP.indexOf(':') != -1) return "Neither";
if (queryIP.indexOf('.') != -1) return checkIPv4(queryIP);
if (queryIP.indexOf(':') != -1) return checkIPv6(queryIP);
return "Neither";
}
}



