题解 | #识别有效的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;
    }
}

全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务