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

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

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

import java.io.*;

public class Main{
    static int[] res = new int[7];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while((str = br.readLine())!=null) {
            count(str);
        }
        StringBuilder sb = new StringBuilder();
        for(int i : res) sb.append(i).append(' ');
        System.out.print(sb.toString());
    }

    static void count(String str) {
        String[] ss = str.split("~");
        if(!isValidCover(ss[1])) {
            if(isValid(ss[0])) {
                String t = ss[0].split("\\.")[0];
                if(t.equals("0") || t.equals("127")) return;
                else res[5]++;
            }else res[5]++;
        }
        else {
            if (!isValid(ss[0])) res[5]++;
            else CountIp(ss[0]);
        }
        // 掩码仅仅检验了是不是合法,没检验是不是该ip对应的掩码

    }

    // 有四个被三个点号分开的整数且都在[0,255]范围内
    static boolean isValid(String s) {
        if(!s.contains(".")) return false;
        String[] ss = s.split("\\.");
        if(ss.length != 4) return false;
        for(String si : ss) {
            if(si.length() == 0) return false;
            else {
                // 默认都是数字没有其他字符
                int t = Integer.parseInt(si);
                if(t < 0 || t > 255) return false;
            }
        }
        return true;
    }

    // 检验ip地址同时计数
    static void CountIp(String s) {
        if(!isValid(s)) {
            return;
        }
        else {
            String[] ss = s.split("\\.");
            // 【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类
            if(Integer.parseInt(ss[0]) == 0 || Integer.parseInt(ss[0]) == 127) return;
            int ip0 = Integer.parseInt(ss[0]);
            if(ip0 <= 126) res[0]++;
            else if(ip0 <= 191) res[1]++;
            else if(ip0 <= 223) res[2]++;
            else if(ip0 <= 239) res[3]++;
            else res[4]++;
            // 私有地址
            if(ip0 == 10
                    || (ip0 == 172 && Integer.parseInt(ss[1]) <= 31 && Integer.parseInt(ss[1]) >= 16)
                    || (ip0 == 192 && Integer.parseInt(ss[1]) == 168)
            ){
                res[6]++;
            }
        }
    }

    static boolean isValidCover(String s) {
        if(!isValid(s)) return false;
        else {
          	// 先排除这两个非法掩码
            if(s.equals("255.255.255.255")
                    || s.equals("0.0.0.0")) return false;
            StringBuilder sb = new StringBuilder();
            String[] ss = s.split("\\.");
            for(String si : ss) {
                String temp = Integer.toBinaryString(Integer.parseInt(si));
              	// 不足八位的在前面补零
                int len = temp.length();
                while(len++ < 8) temp = "0" + temp;
                sb.append(temp);
            }
            char[] ch = sb.toString().toCharArray();
            for(int i = 0; i < ch.length; i++) {
              	// 如果前一位为0后一位为1,掩码非法
                if(i > 0 && ch[i-1] == '0' && ch[i] == '1') return false;
            }
            return true;
        }
    }
}
全部评论

相关推荐

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