题解 | #验证IP地址#

验证IP地址

https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {

        // ip地址的类型,可能为
        // IPv4,   IPv6,   Neither
        if (isIpv4(IP)) {
            // 判断是否为 IPv4
            return "IPv4";
        }
        if (isIpv6(IP)) {
            // 判断 是否为 Ipv6
            return "IPv6";
        }
        // 既不是 IPv4 也不是 IPv6
        return "Neither";
    }
    public boolean isIpv4(String ip) {
        // ipv4
        String[] strs = ip.split("\\.");
        if (strs.length != 4) {
            return false;
        }
        for (String s : strs) {
            // 不能为空 不能出现 ..
            if (s.length() == 0) {
                return false;
            }
            //  不能出现 01
            if (s.startsWith("0") && s.length() > 1 ) {
                return false;
            }
            // 不能含非数字字符
            for (char c : s.toCharArray()) {
                if (!Character.isDigit(c)) {
                    return false;
                }
            }
            // 范围 0-255
            int num = Integer.valueOf(s);
            if (num < 0 || num > 255) {
                return false;
            }
        }
        // 每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1
        // IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
        return true;
    }
    public boolean isIpv6(String ip) {
        String[] strs = ip.split(":", -1);
        // 不限制结果数组的大小,即返回所有可能的分割部分。
        // 这样做可以确保保留以 : 分割的所有空字符串部分(如果有的话)。
        if (strs.length != 8) {
            return false;
        }
        // IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址
        // 即,忽略 0 开头,忽略大小写

        // 0 1 2 3 4 5 6 7 8 9 A B C D E F 进位
        // 在十六进制表示中,有效的数字包括:

        // 数字 0 到 9(对应 ASCII 值 48 到 57)
        // 小写字母 a 到 f(对应 ASCII 值 97 到 102)
        // 大写字母 A 到 F(对应 ASCII 值 65 到 70)

        // 因此,条件表达式中的三个子表达式分别判断了以下情况:

        // (c >= '0' && c <= '9'):字符 c 是否在数字 '0' 到 '9' 的范围内。
        // ('a' <= c &&
        //  c <= 'f'):字符 c 是否在小写字母 'a' 到 'f' 的范围内。
        // ('A' <= c &&
        //  c <= 'F'):字符 c 是否在大写字母 'A' 到 'F' 的范围内。

        // 如果字符 c 满足以上任意一个子表达式的条件,则它可以被认为是一个十六进制数字。

        for (String s : strs) {
            if (s.length() == 0 || s.length() > 4 ) {
                return false;
            }
            for (char c : s.toCharArray()) {
                // 判断是不是十六进制数字
                if ( !( (c >= '0' && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c &&
                        c <= 'F') ) ) {
                    // 不是十六进制数字 返回false
                    return false;
                }
            }
        }
        return true;
    }

}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务