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

  1. 查看 IP 第一段是否为 0127 ,若是则忽略;
  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.255172.16.0.0~172.31.255.255192.168.0.0~192.168.255.25

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int aNum = 0, bNum = 0, cNum = 0, dNum = 0, eNum = 0, errNum = 0, priNum = 0;
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String[] strs = in.nextLine().split("~");
            String[] ips = strs[0].split("\\.");
            int ipFirst = Integer.valueOf(ips[0]);
            int ipSecond = Integer.valueOf(ips[1]);
            if (ipFirst == 0 || ipFirst == 127) {
                continue;
            }
            if (!maskValid(strs[1])) {
                errNum++;
                continue;
            }
            if (!ipValid(strs[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++;
            }
            if (ipFirst == 10 || (ipFirst == 172 && ipSecond >= 16 && ipSecond <= 31) || (ipFirst == 192 && ipSecond == 168)) {
                priNum++;
            }
        }
        System.out.println(aNum + " " + bNum + " " + cNum + " " + dNum + " " + eNum + " " + errNum + " " + priNum);
    }

    public static boolean ipValid(String str) {        
        String[] ip = str.split("\\.");
        if (ip.length != 4) {
            return false;
        }
        for (String s : ip) {
            if (Integer.parseInt(s) < 0 || Integer.parseInt(s) > 255) {
                return false;
            }
        }
        return true;
    }

    public static boolean maskValid(String str) {
        if (!ipValid(str)) {
            return false;
        }
        String[] mask = str.split("\\.");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < mask.length; i++) {
            mask[i] = Integer.toBinaryString(Integer.parseInt(mask[i]));
            if (mask[i].length() < 8) {
                for (int j = 0; j < 8 - mask[i].length(); j++) {
                    sb.append("0");
                }
                sb.append(mask[i]);
            } else {
                sb.append(mask[i]);
            }
        }
        return sb.toString().lastIndexOf("1") < sb.toString().indexOf("0");
    }
}

全部评论

相关推荐

07-24 13:43
门头沟学院 Java
longerluck...:我猜说的是“你真**是个天才”
投递美团等公司10个岗位
点赞 评论 收藏
分享
在等offer的火锅...:我去履历这么好,都找不到工作吗?
点赞 评论 收藏
分享
机械打工仔:不管啥专业,找工作改简历的第一课先把你那排版改了,简历上不要写个人简历四个字,找你要简历的谁不知道这个是简历?而且还占那么多空间,直接把自己名字和基础信息写上面,整体字体大一些。 还有这种经典两页简历一页大空白,导出PDF的时候多了一页几乎全是白的你自己看着不难受吗随手的事为啥不能改掉呢,这是态度问题,你试想一下你是HR你打开简历看到格式都没调整过会是什么感受?你自己都不重视你的简历,HR更不会在意。 然后内容你那个做两年咖啡就别往里写了,简历在精不在多,你在往你的简历里打字的时候就要想好这东西对你要找的工作有没有帮助。自我评价写一行就行了,不如给专业技能单开一栏。核心课程均分90这个真别写了,把你上过的有用的专业课列出来也行。有很多地方废话很多的精炼一下,比如你校内项目第一个写的那些,全然没有重点。 好好修改一下,我看你内容也挺优秀的,别被一个随便做的简历耽误了,我一个同专业的打工人看了都揪心更别说一天看几百份简历的HR
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务