每日一题 之 验证ip地址

167 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

前言

今天的题目是中等题,验证ip地址,这题目不难,主要难在边界判断上面,边界判断条件很多,每一个例子都要补一下边界条件。时不时就会漏一个。

题目

468. 验证IP地址 【难度中等】 边界边界还是边界。

给定一个字符串 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 中允许前导零。

解题思路

由题可知题目已经把所有的边界条件都列出来了,我们只需要根据他的边界条件走即可,我的思路是先判断地址是ipv4 还是ipv6,这个从他们的长度就能获取到了,然后根据ipv4和ipv6的特性去一一化解,ipv4基本是纯数字并且不能为有特殊符号等,而ipv6则是字母加数字,十六进制字母的限制。我们根据他的边界条件写出如下代码直接提交通过。

解题代码

class Solution {
    public String validIPAddress(String queryIP) {
        String[] ipv4s = queryIP.split("\\.");
        String[] ipv6s = queryIP.split(":");

        if (ipv4s.length == 4) {
            char[] ipChar = queryIP.toCharArray();
            for (int i = 0; i < ipChar.length; i++) {
                if (i == ipChar.length - 1){
                    if (ipChar[i] == 46) {
                        return "Neither";
                    }
                }

            }
            for (int i = 0; i < ipv4s.length; i++) {
                String numStr = ipv4s[i];
                if (numStr.equals("")){
                    return "Neither";
                }
                char[] chars = numStr.toCharArray();
                for (int j = 0; j < chars.length; j++) {
                    if (!(chars[j] >= 48 && chars[j]<= 57)){
                        return "Neither";
                    }
                    if (chars.length == 1){
                        continue;
                    }
                    if ((chars[j] == 48 && j == 0)){
                        return "Neither";
                    }
                }
                int num = 0;
                try {
                    num = Integer.parseInt(numStr);
                }catch (Exception e){
                    return "Neither";
                }

                if (!(num >= 0 && num <= 255)) {
                    return "Neither";
                }
            }
            return "IPv4";
        }else if(ipv6s.length == 8){
            char[] ipChar = queryIP.toCharArray();
            for (int i = 0; i < ipChar.length; i++) {
                if (!((ipChar[i] >= 97 && ipChar[i] <= 102) || (ipChar[i] >= 65 && ipChar[i]<= 70) || (ipChar[i] >= 48 && ipChar[i]<= 57) || ipChar[i] == 58)){
                    return "Neither";
                }
                if (i == ipChar.length - 1){
                    if (ipChar[i] == 58) {
                        return "Neither";
                    }
                }

            }

            // a-z 97 -102 A-Z 65-70 0-9 48-57
            for (String ipv6 : ipv6s) {
                if (ipv6.equals("")) {
                    return "Neither";
                }
            }
            for (int i = 0; i < ipv6s.length; i++) {
                char[] chars = ipv6s[i].toCharArray();
                if (chars.length > 4){
                    return "Neither";
                }
            }
            return "IPv6";
        }
        return "Neither";
    }
}