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

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

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

!!个人解法,非最优!!

我真服了这题,面相答案编程。。

  1. 先判断IP 中 0 与 127 开头
  2. 检查掩码(因为掩码有一票否决权)
  3. 检查IP 和 私有IP
import java.util.Scanner;
import java.util.*;
import java.util.Arrays;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    private static final int[] ans = new int[7];
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        next:
        while (in.hasNext()) { // 注意 while 处理多个 case
            String[] strs = in.nextLine().split("~");
            String[] addr = strs[0].split("\\.");
            String[] mask = strs[1].split("\\.");
            // check 0 and 127
            int p0 = addr[0] != null ? Integer.parseInt(addr[0]) : 0;
            if (p0 == 0 || p0 == 127) {
                continue;
            }
            // check Mask
            if (isIllegalMask(mask)) {
                ans[5]++;
                continue;
            } else {
                int pre = 0;
                for (int i = mask.length - 1; i >= 0; i--) {
                    int part = Integer.parseInt(mask[i]);
                    int x = 255;
                    while (x != 0) {
                        int cur = 0;
                        if ((cur = (part & 1)) < pre) {
                            ans[5]++;
                            continue next;
                        }
                        pre = cur;
                        part >>= 1;
                        x >>= 1;
                    }
                }
            }
            // check IP and Private IP
            
            if (isIllegalIP(addr)) {
                ans[5]++;
            } else if (p0 >= 1 && p0 <= 126) {
                // A class
                ans[0]++;
                if (p0 == 10) ans[6]++;
            } else if (p0 >= 128 && p0 <= 191) {
                // B class
                ans[1]++;
                int p1 = Integer.parseInt(addr[1]);
                if (p0 == 172 && p1 >= 16 && p1 <= 31) ans[6]++;
            } else if (p0 >= 192 && p0 <= 223) {
                // C class
                ans[2]++;
                int p1 = Integer.parseInt(addr[1]);
                if (p0 == 192 && p1 == 168) ans[6]++;
            } else if (p0 >= 224 && p0 <= 239) {
                // D class
                ans[3]++;
            } else if (p0 >= 240 && p0 <= 255) {
                // E class
                ans[4]++;
            } else {
                ans[5]++;
            }
        }
        System.out.println(String.join(" ",
                                       Arrays.stream(ans).mapToObj(String::valueOf).toArray(String[]::new)));
    }
    private static boolean isIllegalIP(String[] addr) {
        if (addr.length < 4) return true;
        for (String i : addr) {
            if ("".equals(i)) {
                return true;
            }
        }
        return false;
    }

    private static boolean isIllegalMask(String[] addr) {
        if (addr.length < 4) return true;
        boolean allZero = true;
        boolean allOne = true;
        for (String i : addr) {
            if ("".equals(i)) {
                return true;
            }
            allZero &= i.equals("0");
            allOne &= i.equals("255");
        }
        return allZero || allOne;
    }
}

全部评论

相关推荐

07-02 13:52
门头沟学院 Java
点赞 评论 收藏
分享
仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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