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

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

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

import java.util.Scanner;

/**
 * HJ18 识别有效的IP地址和掩码并进行分类统计
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int aNum = 0;
        int bNum = 0;
        int cNum = 0;
        int dNum = 0;
        int eNum = 0;
        int errNum = 0;
        int privNum = 0;
        while (scanner.hasNextLine()) {
            String str = scanner.nextLine();
            if (str.equals("")) {
                break;
            }
            String[] input = str.split("~");
            int ipFirst = getIpSeg(input[0], 0);
            // 0和127开头的过滤掉不计数
            if (ipFirst == 0 || ipFirst == 127) {
                continue;
            }
            // 非法IP和非法掩码计数
            if (!isValidIp(input[0])) {
                errNum++;
                continue;
            }
            if (!isValidMask(input[1])) {
                errNum++;
                continue;
            }
            // ABCDE计数
            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++;
            }
            //私有IP计数
            int ipSecond = getIpSeg(input[0], 1);
            if (ipFirst == 10 || (ipFirst == 172 && ipSecond >= 16 && ipSecond <= 32) ||
                    (ipFirst == 192 && ipSecond == 168)) {
                privNum++;
            }
        }
        System.out.println(aNum + " " + bNum + " " + cNum + " " + dNum + " " + eNum +
                           " " + errNum + " " + privNum);
    }

    static int getIpSeg(String ip, int index) {
        String[] arr = ip.split("\\.");
        return Integer.parseInt(arr[index]);
    }

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

    static boolean isValidMask(String mask) {
        if (!isValidIp(mask)) {
            return false;
        }

        StringBuilder stringBuilder = new StringBuilder();
        String[] maski = mask.split("\\.");

        for (String ss : maski) {
            String binary = Integer.toBinaryString(Integer.parseInt(ss));
            binary = String.format("%08d", Integer.parseInt(binary));
            stringBuilder.append(binary);
        }
        // 主机号为0(00000000)且在网络号(11111111)后
        return stringBuilder.toString().lastIndexOf("1") <
               stringBuilder.toString().indexOf("0");
    }
}

全部评论

相关推荐

昨天 16:52
已编辑
门头沟学院 Java
周五投的,流程今天结束
投递地平线等公司7个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 11:24
大家还是用ai改吧,我心疼得要死,就当花钱买教训吧,人家直接拿完钱就跑路了
程序员小白条:简历修改700....神奇,又不是帮你面试,咋的,简历修改从双非变92了还是没实习变成有大厂实习了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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