看大家写的的脑壳大,还是自己写吧

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

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

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
        Scanner in = new Scanner(System.in);

        MyCount myCount = new MyCount();
        while (in.hasNextLine()) {
            String string = in.nextLine();
            if (string.isEmpty()) {
                break;
            }
            // 分ip和子网掩码
            String[] strings = string.split("~");

            String ip = strings[0];
            String[] ipSplit = ip.split("\\.");

            // 127/0 不纳入计算的ip
            if (isInvalidIp(ipSplit)) {
                continue;
            }

            // 注意同一行数据中,ip或者子网掩码其中一个错就当做一次累计
            if (isError(ipSplit) || isErrorMask(strings[1].split("\\."))) {
                myCount.setErrorIpOrMask(myCount.getErrorIpOrMask() + 1);
                continue;
            }
            // 处理ip,包括私有的
            handleIp(ipSplit, myCount);

        }

        System.out.println(myCount.getA() + " " + myCount.getB() + " "
                           + myCount.getC() + " " + myCount.getD() + " " + myCount.getE() +
                           " " + myCount.getErrorIpOrMask() + " " + myCount.getpIp());


    }

    private static boolean isErrorMask(String[] maskArr) {
        if (maskArr.length != 4 || !isNumericOrRange(maskArr)) {
            return true;
        }

        // 获得子网掩码的二进制字符串
        char[] charArray = getBinaryString(maskArr);
        // 第一位非1
        if (charArray[0] != '1') {
            return true;

        }
        boolean isZero = false;
        for (char c : charArray) {
            if (c == '0') {
                isZero = true;
            } else if (c == '1' && isZero) {
                return true;
            }
        }
        // 千万注意全是1的情况
        if (!isZero) {
            return true;
        }

        return false;

    }

    private static char[] getBinaryString(String[] maskArr) {
        StringBuilder stringBuilder = new StringBuilder();
        for (String string : maskArr) {
            int maskN = Integer.parseInt(string);
            /**
             * 子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
             * (注意二进制下全是1或者全是0均为非法子网掩码)
             */
            // 8位2进制数即0~255范围
            String binaryString = Integer.toBinaryString(maskN);
            for (int i = 0; i < 8 - binaryString.length(); i++) {
                stringBuilder.append("0");
            }
            stringBuilder.append(binaryString);

        }

        char[] charArray = stringBuilder.toString().toCharArray();
        return charArray;
    }


    private static void handleIp(String[] ipSplit, MyCount myCount) {

        String ipFragment = ipSplit[0];
        int ipF = Integer.parseInt(ipFragment);
        // 公网ip abcde
        if (ipF >= 1 && ipF <= 126) {
            myCount.setA(myCount.getA() + 1);
        }

        if (ipF >= 128 && ipF <= 191) {
            myCount.setB(myCount.getB() + 1);
        }

        if (ipF >= 192 && ipF <= 223) {
            myCount.setC(myCount.getC() + 1);
        }
        if (ipF >= 224 && ipF <= 239) {
            myCount.setD(myCount.getD() + 1);
        }
        if (ipF >= 240 && ipF <= 255) {
            myCount.setE(myCount.getE() + 1);
        }
        int ipF2 = Integer.parseInt(ipSplit[1]);

        boolean pIp = false;
        // 私网ip
        if (ipF == 10) {
            pIp = true;
        }
        if (ipF == 172 && ipF2 >= 16 && ipF2 <= 31) {
            pIp = true;
        }
        if (ipF == 192 && ipF2 == 168) {
            pIp = true;
        }

        if (pIp) {
            myCount.setpIp(myCount.getpIp() + 1);
        }

    }

    private static boolean isError(String[] ipSplit) {
        boolean errorIp = false;

        // 非4段
        if (ipSplit.length != 4) {
            errorIp = true;
        } else {
            for (String str : ipSplit) {
                // 不是数字
                if (!isNumeric(str)) {
                    errorIp = true;
                    break;
                }
                int ipNum = Integer.parseInt(str);
                // 范围不对
                if (ipNum < 0 || ipNum > 255) {
                    errorIp = true;
                    break;
                }
            }
        }
        return errorIp;
    }

    // 无效ip
    public static boolean isInvalidIp(String[] ip) {
        // 能被"."分成4段且开头为0或者127
        if (ip.length == 4 && (ip[0].equals("0") || ip[0].equals("127"))) {
            return true;
        }

        return false;

    }

    public static boolean isNumeric(String str) {
        for (char c : str.toCharArray()) {
            if (!Character.isDigit(c)) {
                return false;
            }
        }
        return str.length() > 0;
    }

    public static boolean isNumericOrRange(String[] str) {
        for (int i = 0; i < str.length; i++) {
            if (!isNumeric(str[i])) {
                return false;
            }
            int range = Integer.parseInt(str[i]);
            // 遍历每一段看是否符合0~255
            if (range < 0 || range > 255) {
                return false;
            }
        }
        return true;
    }

    static class MyCount {

        private long a = 0;
        private long b = 0;
        private long c = 0;
        private long d = 0;
        private long e = 0;
        // 错误ip和掩码
        private long errorIpOrMask = 0;
        // 私有ip
        private long pIp = 0;

        public MyCount() {
        }

        public long getA() {
            return a;
        }

        public void setA(long a) {
            this.a = a;
        }

        public long getB() {
            return b;
        }

        public void setB(long b) {
            this.b = b;
        }

        public long getC() {
            return c;
        }

        public void setC(long c) {
            this.c = c;
        }

        public long getD() {
            return d;
        }

        public void setD(long d) {
            this.d = d;
        }

        public long getE() {
            return e;
        }

        public void setE(long e) {
            this.e = e;
        }

        public long getErrorIpOrMask() {
            return errorIpOrMask;
        }

        public void setErrorIpOrMask(long errorIpOrMask) {
            this.errorIpOrMask = errorIpOrMask;
        }

        public long getpIp() {
            return pIp;
        }

        public void setpIp(long pIp) {
            this.pIp = pIp;
        }
    }

}

全部评论

相关推荐

allin秋招的大菠萝很爱交友:后续,已拿offer ~查看图片
点赞 评论 收藏
分享
高斯林的信徒:问你有没有保底,好人啊,就差把这是kpi面告诉你了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务