题解 | #识别有效的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 scanner = new Scanner(System.in);
        int[] counts = new int[7]; // A,B,C,D,E,Error,Private

        while (scanner.hasNextLine()) {
            String[] intput = scanner.nextLine().split("~");
            String ip = intput[0];
            String mask = intput[1];

            classifyIpAndUpdateCounts(ip, mask, counts);
        }

        for (int count : counts) {
            System.out.print(count + " ");
        }

    }

    private static void classifyIpAndUpdateCounts(String ip, String mask,
            int[] counts) {
       if (!isValidIP(ip)) {
            counts[5]++; // Error
            return;
        }
        String[] ipParts = ip.split("\\.");
        int firstOctet = Integer.parseInt(ipParts[0]);

        if (firstOctet == 0 || firstOctet == 127) {
            return;
        }
        if (!isValidSubnetmask(mask)) {
            counts[5]++; // Error
            return;
        }

        if (1 <= firstOctet && firstOctet <= 126) {
            counts[0]++; //A
        } else if (128 <= firstOctet && firstOctet <= 191) {
            counts[1]++;//B
        } else if (192 <= firstOctet && firstOctet <= 223) {
            counts[2]++;//C
        } else if (224 <= firstOctet && firstOctet <= 239) {
            counts[3]++;//D
        } else if (240 <= firstOctet && firstOctet <= 255) {
            counts[4]++;//E
        }

        int secondOctet = Integer.parseInt(ipParts[1]);
        if (firstOctet == 10 || (firstOctet == 192 && secondOctet == 168) ||
                (firstOctet == 172 && (16 <= secondOctet && secondOctet <= 31))) {
            counts[6]++;
        }
    }

    private static boolean isValidIP(String ip) {
        String[] parts = ip.split("\\.");

        if (parts.length != 4) {
            return false;
        }

        for (String part : parts) {
            int ipTemp = Integer.parseInt(part);
            if (!part.matches("\\d+") || ipTemp < 0 || ipTemp > 255) {
                return false;
            }
        }
        return true;
    }

    private static boolean isValidSubnetmask(String subnetMask) {
        String[] octets = subnetMask.split("\\.");
        if (octets.length != 4) {
            return false;
        }
        int bitmask = 0;
        // 将每个八位子网掩码转换为整数并添加到位掩码中
        for (String octet : octets) {
            int octetValue = Integer.parseInt(octet);

            bitmask = (bitmask << 8) | octetValue;
        }
        String binaryString = Integer.toBinaryString(bitmask);
        char firstChar = binaryString.charAt(0);
        if (binaryString.chars().allMatch(c ->c == firstChar)) {
            return false;
        }
        // 将位掩码取反后加1,然后检查是否为2的幂
        bitmask = ~bitmask + 1;
        return (bitmask & (bitmask - 1)) == 0;
    }


}

1、首先判断是否是合法ip,以.进行分片后,应该为4部分,判断每部分都为数字,且不能小于0或者大于255

2、如果ip以0或127开头则直接跳过

3、判断是否是合法子网掩码,以.进行分片后,应该为4部分,将每个八位子网掩码转换为整数并添加到位掩码中,利用整数的位运算,先左移8位,再或运算。将位掩码按位取反加1,得到补码,补码与补码减1,如果为0,则是2的整数次幂,即掩码的二进制为连续的1接连续的0,注意:利用Integer.toBinaryString()将整形转换为二进制字符串,利用string.chars().allMatch(c->c==firstChar)判断,掩码是否全是0或1,返回false;

4、之后判断ip所属,利用int 数组累加,输出

全部评论

相关推荐

优秀的大熊猫在okr...:多益:此贼,必有同谋,按律,该当连坐!
你不能接受的企业文化有哪...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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