题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

结合前面几位大佬的题解,整出一个Java版.这里有个大坑,若是ip是0或者127开头的直接忽略,即使子网掩码是非法的,也不能将此算到error里去。 具体实现

  1. 查看ip第一段是否为“0”或“127”,若是忽略;
  2. 判断子网掩码是否合法,如果满足下列条件之一即为非法掩码
  • 数字段数不为4
  • 在二进制下,不满足前面连续是1,然后全是0
  • 在二进制下,全为0或全为1
  1. 判断IP地址是否合法,如果满足下列条件之一即为非法地址
  • 数字段数不为4,比如存在空段,即【192..1.0】这种;
  • 某个段的数字大于255
  1. 判断ip是否是ABCDE类地址,若是对应类加一。 所有的IP地址划分为 A,B,C,D,E五类: A类地址1.0.0.0 ~ 126.255.255.255; B类地址128.0.0.0 ~ 191.255.255.255; C类地址192.0.0.0 ~ 223.255.255.255; D类地址224.0.0.0 ~ 239.255.255.255; E类地址240.0.0.0 ~ 255.255.255.255

  2. 判断ip是否私有地址。 私网IP范围是: 10.0.0.0~10.255.255.255 172.16.0.0~172.31.255.255 192.168.0.0~192.168.255.255

import java.util.*;
public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int aNum = 0;
            int bNum = 0;
            int cNum = 0;
            int dNum = 0;
            int eNum = 0;
            int errNum = 0;
            int pNum = 0;
            while (sc.hasNextLine()) {
                String str = sc.nextLine();
                String[] strArr = str.split("~");
                int ipFirst = getIpSeg(strArr[0], 0);
                if (ipFirst == 0 || ipFirst == 127) {
                    continue;
                }
                if (maskIsInvaild(strArr[1])) {
                    errNum++;
                    continue;
                }
                if (ipIsInvaild(strArr[0])) {
                    errNum++;
                    continue;
                }
                if (ipFirst >= 1 && ipFirst <= 126) {
                    aNum++;
                }
                if (ipFirst >= 128 && ipFirst <= 191) {
                    bNum++;
                }
                if (ipFirst >= 192 && ipFirst <= 223) {
                    cNum++;
                }
                if (ipFirst >= 224 && ipFirst <= 239) {
                    dNum++;
                }
                if (ipFirst >= 240 && ipFirst <= 255) {
                    eNum++;
                }
                int ipSecond = getIpSeg(strArr[0], 1);
                if (ipFirst == 10 || (ipFirst == 172 && ipSecond >= 16 && ipSecond <=31) || (ipFirst == 192 && ipSecond == 168)) {
                    pNum++;
                }
            }
            System.out.println(aNum + " " + bNum + " " + cNum + " " + dNum + " " + eNum + " " + errNum + " " + pNum);
        }
    
    public static boolean maskIsInvaild(String mask) {
        String[] maskArr = mask.split("\\.");
        if (maskArr.length != 4) {
            return true;
        }
        String maskBinary = toBinary(maskArr[0]) + toBinary(maskArr[1]) + toBinary(maskArr[2]) + toBinary(maskArr[3]);
        if (!maskBinary.matches("[1]{1,}[0]{1,}")) {
            return true;
        }
        return false;
    }
    
    public static String toBinary(String num) {
        String numBinary = Integer.toBinaryString(Integer.valueOf(num));
        while (numBinary.length() < 8) {
            numBinary = "0" + numBinary;
        }
        return numBinary;
    }
    
    public static boolean ipIsInvaild(String ip) {
        String[] ipArr = ip.split("\\.");
        if (ipArr.length != 4) {
            return true;
        }
        if (Integer.valueOf(ipArr[0]) > 255 || Integer.valueOf(ipArr[1]) > 255 || Integer.valueOf(ipArr[2]) > 255 || Integer.valueOf(ipArr[3]) > 255) {
            return true;
        }
        return false;
    }
    
    public static int getIpSeg(String ip, int index) {
        String[] ipArr = ip.split("\\.");
        return Integer.valueOf(ipArr[index]);
    }
}
全部评论
【若是ip是0或者127开头的直接忽略,即使子网掩码是非法的,也不能将此算到error里去】这可真是个大坑,题目信息点太零散,在测试用例8/10真是怀疑人生了
8 回复 分享
发布于 2022-06-24 11:38
请问这个hasNextLine,是怎么结束的呢?牛客上这个程序没问题,但是idea上会报错
5 回复 分享
发布于 2022-01-04 13:27
用 int firstIndexOf0 = sb.indexOf("0"); int lastIndexOf1 = sb.lastIndexOf("1"); if (firstIndexOf0 < lastIndexOf1) { res = false; } 取代正则表达式 要好一点
4 回复 分享
发布于 2023-02-20 11:31 浙江
案例19..0.换成19..0.0就寄了
3 回复 分享
发布于 2023-03-21 23:46 云南
华为OD深圳/西安岗位,部门急招,薪资20-80w. 部门有专门机考辅导人员,每周开视频讲座。欢迎叨扰:***********
2 回复 分享
发布于 2023-05-10 15:55 广东
为啥要拼0凑成8位呀
1 回复 分享
发布于 2022-10-30 23:03 陕西
very 的 呦西
1 回复 分享
发布于 2023-01-06 14:23 江苏
我说我的子网掩码怎么多算了一个
1 回复 分享
发布于 2023-04-26 10:57 浙江
如果ip以0或127开头,ip不统计,为什么直接countinue,不判断掩码了 如果ip不以0或者127开头,为什么掩码无效直接countinue,不判断ip了,不应该ip和掩码各算各的嘛
1 回复 分享
发布于 2023-07-27 00:08 陕西
为什么掩码错误就不用判断ip了?题目不是说单独归类吗?
1 回复 分享
发布于 2023-09-22 19:27 陕西
ip中包含*的是不是没处理呀
点赞 回复 分享
发布于 2022-11-05 10:20 四川
掩码的二进制是否为连续的1和连续的0,我理解只需要判断四段的数字是否0或255就OK了
点赞 回复 分享
发布于 2023-01-27 14:03 广东
matches("[1]{1,}[0]{1,}" 这里 以10为结尾的 二进制地址 也会被判true
点赞 回复 分享
发布于 2023-02-20 11:27 浙江
思路清晰,可以作为范例了,学习了
点赞 回复 分享
发布于 2023-03-25 22:42 陕西
思路清晰,代码看的真舒服。
点赞 回复 分享
发布于 2023-07-08 17:24 广东
没注意掩码在执行完Integer.toBinaryString(num)后要补齐八位再判断,找了半天,看了楼主的答案才意识到问题在哪儿,感谢感谢
点赞 回复 分享
发布于 2023-10-27 20:52 北京
Integer.valueOf(ipArr[0])这里如果是空的话,会报错,建议补一个判断是否为空先,然后转换成Integer会更严谨一点
点赞 回复 分享
发布于 2024-03-23 04:42 美国

相关推荐

01-14 19:01
吉首大学 Java
黑皮白袜臭脚体育生:加个项目吧,一般需要两个项目一业务一轮子呢,简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
52
14
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客企业服务