这个题解答方式多种多样。本题解的一种思路,把IP按分隔符分割成字符串数组,然后对数组的每个元素挨个验证是否符合规则就行。时间复杂度O(N)。
public class Solution {
public String solve (String IP) {
if(IP.endsWith(".")||IP.endsWith(":"))return "Neither";
boolean flag = IP.contains(".");//如果flag为真,则是IPV4的规则,否则就是IPV6的规则。
String[] ips = flag?IP.split("\\."):IP.split(":");
if(flag){
if(ips.length!=4)return "Neither";//IPV4数组长度应该为4
for(int i = 0 ; i < ips.length; ++i){
if(ips[i].length()>1&&ips[i].startsWith("0"))return "Neither";
int temp = 0 ;
try{
temp = Integer.parseInt(ips[i]);
}
catch(Exception e){
return "Neither";
}
finally{
if(temp>=256)return "Neither";//IPV4要求字符串组成的数组小于256.
}
}
return "IPv4";
}
else {
if(ips.length!=8)return "Neither";//IPV6字符串数组长度为8
for(int i=0;i<ips.length;++i){
if(ips[i].equals(""))return "Neither";//如果遇到空串,则说明肯定存在“::"这种场景,不符合要求
if(judge(ips[i])){
continue;
}
else return "Neither";
}
return "IPv6";
}
}
public boolean judge(String s1){//IPV6要求是16进制数,那么要判断字符串是否有其它字母,过滤掉。
if(s1.length()>4)return false;
for(int i=0;i<s1.length();++i){
char c = s1.charAt(i);
if(c>='0'&&c<='9'||c>='A'&&c<='F'||c>='a'&&c<='f')continue;
else return false;
}
return true;
}
}