题解 | #验证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;
    }

}

全部评论

相关推荐

会员标识
02-20 16:28
已编辑
牛客运营
从03年的“北大毕业生卖猪肉”到前段时间上热搜的“北大博士入职城管”,这些年“下沉式就业”现象频繁牵动着大家的视野和目光吧,很吸睛?我觉得并不是,如果你说985大学生XXX,那可能成不了焦点,如果说是北大清华毕业生去当城管,卖猪肉,大家都会讨论一番,无论是谁都知道北大清华的过人之处。但是呢近些年的确有很多985、211名校毕业生选择到基层就业或回老家创业,会不会觉得大财小用?老家的哥哥,因为当时学的专业不是很好,但好在学校不错,一路本硕连读,毕业之后在上海打拼了2年,也攒了一些小钱,随后回村选择科学养鸡,买了很大一块地开始科学方法的养鸡、卖鸡蛋,村里的老人都会议论纷纷,白瞎了家里供你读书,又回...
下午吃泡馍:不是每一个脱下长衫的人在下沉市场重获新生,并不是每一个养猪养鸡的高学历人才都会成功。现实是很多人的“长衫”就是自己为数不多甚至唯一的底牌了,拼尽全力拿到一个不错的学历,这时候主流媒体告诉对方脱下长衫也可以活的精彩,其实真的挺难过的。强者恒强,但是弱者是人群的底色。 本质上是整个市场的问题,没有足够多的增长点,没有足够多的岗位,自上而下没有积极向上的氛围。外企撤出,供应链缺失...在发展的过程中总有阵痛,现阶段可能就是我们承受阵痛的过程。之前在牛客看到一个小伙伴说:时代的一粒灰尘,落在谁的身上,都将是无法承受之重!深有感触。
点赞 评论 收藏
分享
02-10 12:23
已编辑
新余学院 C++
采集想要offer:专业技能那里要一条一条的列出来吧,感觉你项目很厉害了,但是如果你不写技术栈面试官对你项目不太懂的话都没办法问你八股😂C++都是基架岗,都是一群9✌🏻在卷,我觉得你要是有时间学个go把MySQL和redis写上去找个开发岗吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务