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

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

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

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 7种情况,A,B,C,D,E,错误IP/错误子网掩码,私有IP
        int error[] = new int[7];
        while (in.hasNextLine()) {
            String ipStr = in.nextLine();
            if (ipStr.equals("")) {
                break;
            }
            // 以~分隔,分别判断2个IP的情况
            String splitIps = ipStr.split("~")[0];
            String splitMask = ipStr.split("~")[1];
            // 判断是否出现0或者127打头的
            if (splitIps.startsWith("0") || splitIps.startsWith("127")) {
                continue;
            }
            // 判断IP是否合法,以.分割,如果个数不为4,或者中间有空都是不合法的
            if (!isIpLegal(splitIps) || !isMaskLegal(splitMask)) {
                error[5]++;
                continue;
            }
            // 判断为哪一类IP
            String[] ips = splitIps.split("\\.");
            Integer firstNum = Integer.parseInt(ips[0]);
            // A类
            if (firstNum >= 1 && firstNum <= 126) {
                error[0]++;
                // 在A类中,从10.0.0.0到10.255.255.255为私有IP
                if (firstNum == 10) {
                    error[6]++;
                }
            }
            // B类
            if (firstNum >= 128 && firstNum <= 191) {
                error[1]++;
                // 在B类中,从172.16.0.0到172.31.255.255为私有IP
                Integer secondNum = Integer.parseInt(ips[1]);
                if (firstNum == 172 && secondNum >= 16 && secondNum <= 31) {
                    error[6]++;
                }
            }
            // C类
            if (firstNum >= 192 && firstNum <= 223) {
                error[2]++;
                // C类中,从192.168.0.0到192.168.255.255为私有IP
                Integer secondNum = Integer.parseInt(ips[1]);
                if (firstNum == 192 && secondNum == 168) {
                    error[6]++;
                }
            }
            // D类
            if (firstNum >= 224 && firstNum <= 239) {
                error[3]++;
            }
            // E类
            if (firstNum >= 240 && firstNum <= 255) {
                error[4]++;
            }
        }
        output(error);
    }

    /**
     * 输出最终的结果
     *
     * @param error 结果集
     */
    private static void output(int[] error) {
        StringBuilder sb = new StringBuilder();
        for (int i : error) {
            sb.append(i).append(" ");
        }
        sb.deleteCharAt(sb.length() - 1);
        System.out.println(sb);
    }

    /**
     * 判断IP是否合法
     *
     * @param splitIps 原始ID
     * @return 结果, true/false
     */
    private static boolean isIpLegal(String splitIps) {
        String[] ips = splitIps.split("\\.");
        if (ips.length != 4) {
            return false;
        }
        for (String ip : ips) {
            if (ip.equals("")) {
                return false;
            }
            if (Integer.parseInt(ip) < 0 || Integer.parseInt(ip) > 255) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断子网掩码是否合法
     *
     * @param splitMask 原始子网掩码
     * @return
     */
    private static boolean isMaskLegal(String splitMask) {
        if (!isIpLegal(splitMask)) {
            return false;
        }
        String[] masks = splitMask.split("\\.");
        // 每一段数量转成二进制字符串,再进行判断是否合法
        String bitStr = toBinaryStr(masks[0]) + toBinaryStr(masks[1]) + toBinaryStr(masks[2]) + toBinaryStr(masks[3]);
        if (!bitStr.matches("1+0+")) {
            return false;
        }
        return true;
    }

    private static String toBinaryStr(String numStr) {
        String bitStr = Integer.toBinaryString(Integer.parseInt(numStr));
        while (bitStr.length() < 8) {
            bitStr = "0" + bitStr;
        }
        return bitStr;
    }
}

全部评论

相关推荐

Sigma429:极兔啊,薪资开的巨低,还在上海,索性不做笔试了
点赞 评论 收藏
分享
08-16 10:51
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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