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

  1. 查看 IP 第一段是否为 0127 ,若是则忽略;
  2. 判断子网掩码是否合法,如果满足下列条件之一即为非法掩码
  • 数字段数不为 4
  • 在二进制下,不满足前面连续是 1,然后全是 0
  • 在二进制下,全为 0 或全为 1
  1. 判断 IP 地址是否合法,如果满足下列条件之一即为非法地址
  • 数字段数不为 4 ,比如存在空段,即 192..1.0 这种;
  • 某个段的数字大于 255
  1. 判断 IP 是否是 ABCDE 类地址,若是,则对应类加一。 所有的 IP 地址划分为 A、B、C、D、E 五类: A 类地址 1.0.0.0 ~ 126.255.255.255; B 类地址 128.0.0.0 ~ 191.255.255.255 ; C 类地址 192.0.0.0 ~ 223.255.255.255 ; D 类地址 224.0.0.0 ~ 239.255.255.255 ; E 类地址 240.0.0.0 ~ 255.255.255.255

  2. 判断 IP 是否是私有地址。 私网IP范围是: 10.0.0.0~10.255.255.255172.16.0.0~172.31.255.255192.168.0.0~192.168.255.25

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int aNum = 0, bNum = 0, cNum = 0, dNum = 0, eNum = 0, errNum = 0, priNum = 0;
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String[] strs = in.nextLine().split("~");
            String[] ips = strs[0].split("\\.");
            int ipFirst = Integer.valueOf(ips[0]);
            int ipSecond = Integer.valueOf(ips[1]);
            if (ipFirst == 0 || ipFirst == 127) {
                continue;
            }
            if (!maskValid(strs[1])) {
                errNum++;
                continue;
            }
            if (!ipValid(strs[0])) {
                errNum++;
                continue;
            }
            if (ipFirst >= 1 && ipFirst <= 126) {
                aNum++;
            }
            if (ipFirst >= 128 && ipFirst <= 191) {
                bNum++;
            }
            if (ipFirst >= 192 && ipFirst <= 223) {
                cNum++;
            }
            if (ipFirst >= 224 && ipFirst <= 239) {
                dNum++;
            }
            if (ipFirst >= 240 && ipFirst <= 255) {
                eNum++;
            }
            if (ipFirst == 10 || (ipFirst == 172 && ipSecond >= 16 && ipSecond <= 31) || (ipFirst == 192 && ipSecond == 168)) {
                priNum++;
            }
        }
        System.out.println(aNum + " " + bNum + " " + cNum + " " + dNum + " " + eNum + " " + errNum + " " + priNum);
    }

    public static boolean ipValid(String str) {        
        String[] ip = str.split("\\.");
        if (ip.length != 4) {
            return false;
        }
        for (String s : ip) {
            if (Integer.parseInt(s) < 0 || Integer.parseInt(s) > 255) {
                return false;
            }
        }
        return true;
    }

    public static boolean maskValid(String str) {
        if (!ipValid(str)) {
            return false;
        }
        String[] mask = str.split("\\.");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < mask.length; i++) {
            mask[i] = Integer.toBinaryString(Integer.parseInt(mask[i]));
            if (mask[i].length() < 8) {
                for (int j = 0; j < 8 - mask[i].length(); j++) {
                    sb.append("0");
                }
                sb.append(mask[i]);
            } else {
                sb.append(mask[i]);
            }
        }
        return sb.toString().lastIndexOf("1") < sb.toString().indexOf("0");
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务