Validate IP Address

考察各种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";
    }
}

results matching ""

    No results matching ""