考察各种corner case和细节的一道题。
IPV4
含有“.”, split("\."). 注意不能split("."), 因为会代表正则通配符。在split的时候,split函数会自动忽略首尾的空字符串,所以这里需要用split("\.", -1).
arr总长度一定是4,每个的长度是1,大于2的时候不能以0开头,等于3的时候必须小于“256”,大于3是false
检查每个字符是否是0~9之间。"1e1.4.5.6"
IPV6
含有“:”
arr总长度一定是8. 每个arr[i]的长度如果大于4或者等于0, false
arr[i]每个字符在0~9,a~f, A~F之间。"2001:0db8:85a3:0:0:8A2E:0370:73341" "20EE:FGb8:85a3:0:0:8A2E:0370:7334"
public class Solution {
public String validIPAddress(String IP) {
String[] arr = null;
if(IP.contains(".")){
arr = IP.split("\\.", -1);
//System.out.println(Arrays.toString(arr));
if(arr.length!=4) return "Neither";
for(int i=0;i<4;i++){
if(arr[i].length()==0 || (arr[i].length()>1 && arr[i].charAt(0)=='0')||(arr[i].length()==3 && arr[i].compareTo("256")>=0)||arr[i].length()>3) return "Neither";
for(int j=0;j<arr[i].length();j++) if(arr[i].charAt(j)<'0' || arr[i].charAt(j)>'9') return "Neither";
}
return "IPv4";
}
else if(IP.contains(":")){
arr = IP.split(":", -1);
// System.out.println(Arrays.toString(arr));
// System.out.println(arr.length);
if(arr.length!=8) return "Neither";
for(int i=0;i<8;i++){
if(arr[i].length()==0 || arr[i].length()>4) return "Neither";
for(int j=0;j<arr[i].length();j++){
if(arr[i].charAt(j)>='0' && arr[i].charAt(j)<='9') continue;
if(arr[i].charAt(j)>='a' && arr[i].charAt(j)<='f') continue;
if(arr[i].charAt(j)>='A' && arr[i].charAt(j)<='F') continue;
return "Neither";
}
}
return "IPv6";
}
else
return "Neither";
}
}