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

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

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


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        HashMap<String, Integer> countMap = new HashMap<>();
        countMap.put("A", 0);
        countMap.put("B", 0);
        countMap.put("C", 0);
        countMap.put("D", 0);
        countMap.put("E", 0);
        countMap.put("errorIPOrMask", 0);
        countMap.put("privateIp", 0);
        String str;
        while ((str = br.readLine()) != null) {
            if ("end".equals(str)){
                break;
            }
            String[] ipAndMask = str.split("\\~");
            if (ipAndMask.length != 2){
                countMap.put("errorIPOrMask", countMap.get("errorIPOrMask") + 1);
                continue;
            }
            String[] leftIpNums = ipAndMask[0].split("\\.");
            String[] rightMasks = ipAndMask[1].split("\\.");
            //判断位数是否正确
            if (leftIpNums.length != 4 || rightMasks.length != 4){
                countMap.put("errorIPOrMask",countMap.get("errorIPOrMask")+1);
                continue;
            }
            //检查ip地址和掩码是否正确
            if(!checkIp(leftIpNums) || !checkIp(rightMasks)){
                countMap.put("errorIPOrMask",countMap.get("errorIPOrMask")+1);
                continue;
            }
            if (("0").equals(leftIpNums[0]) || ("127").equals(leftIpNums[0])){//以0或127开头,不属于任何地址
                continue;
            }
            //掩码是否正确
            if (!checkMask(rightMasks)){
                countMap.put("errorIPOrMask",countMap.get("errorIPOrMask")+1);
                continue;
            }
            //判断ip类型
            if (Integer.parseInt(leftIpNums[0]) >= 1 && Integer.parseInt(leftIpNums[0]) <= 126){      //A类
                    classify(leftIpNums,countMap,"A");
            }else if (Integer.parseInt(leftIpNums[0]) >= 128 && Integer.parseInt(leftIpNums[0]) <= 191) {    //B类
                    classify(leftIpNums,countMap,"B");
            } else if (Integer.parseInt(leftIpNums[0]) >= 192 && Integer.parseInt(leftIpNums[0]) <= 223) {   //C类
                    classify(leftIpNums,countMap,"C");
            } else if (Integer.parseInt(leftIpNums[0]) >= 224 && Integer.parseInt(leftIpNums[0]) <= 239) {   //D类
                    classify(leftIpNums,countMap,"D");
            } else if (Integer.parseInt(leftIpNums[0]) >= 240 && Integer.parseInt(leftIpNums[0]) <= 255) {   //E类
                    classify(leftIpNums,countMap,"E");
            }
        }
                        System.out.println(countMap.get("A")+" "+countMap.get("B")+" "+countMap.get("C")+" "+countMap.get("D")+" "+countMap.get("E")+" "+countMap.get("errorIPOrMask")+" "+countMap.get("privateIp"));

    }

    private static void classify(String[] ipAddress, HashMap<String,Integer> countMap, String type){
        //Ip处理
        if ("A".equals(type)){ //A类地址从1.0.0.0到126.255.255.255;     从10.0.0.0到10.255.255.255          A类   掩码:255.0.0.0
            if ("10".equals(ipAddress[0])){
                countMap.put("privateIp",countMap.get("privateIp")+1);
                countMap.put("A",countMap.get("A")+1);
                return;
            }
            countMap.put("A",countMap.get("A")+1);
        }else if ("B".equals(type)){   //B类地址从128.0.0.0到191.255.255.255;     从172.16.0.0到172.31.255.255        B类   掩码:255.255.0.0
                if ("172".equals(ipAddress[0]) && Integer.parseInt(ipAddress[1]) >= 16 && Integer.parseInt(ipAddress[1]) <= 31){
                    countMap.put("privateIp",countMap.get("privateIp")+1);
                    countMap.put("B",countMap.get("B")+1);
                    return;
                }
                countMap.put("B",countMap.get("B")+1);
        }else if ("C".equals(type)){  //C类地址从192.0.0.0到223.255.255.255;     从192.168.0.0到192.168.255.255      C类   掩码:255.255.255.0
                if ("192".equals(ipAddress[0]) && "168".equals(ipAddress[1])){
                    countMap.put("privateIp",countMap.get("privateIp")+1);
                    countMap.put("C",countMap.get("C")+1);
                    return;
                }
                countMap.put("C",countMap.get("C")+1);
        }else if ("D".equals(type)){  //D类地址从224.0.0.0到239.255.255.255;
            countMap.put("D",countMap.get("D")+1);
        }else if ("E".equals(type)){  //  E类地址从240.0.0.0到255.255.255.255
            countMap.put("E",countMap.get("E")+1);
        }
    }

    private static boolean checkMask(String[] masks){
        //masks转为32位2进制字符串
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<masks.length;i++){
            masks[i] = Integer.toBinaryString(Integer.parseInt(masks[i]));
            if(masks[i].length() < 8){//不足8位补齐0
                for(int j=0;j < 8- masks[i].length();j++){
                    sb.append("0");//补完零
                }
                sb.append(masks[i]);//再添加转换的2进制串
            }else{
                sb.append(masks[i]);//刚好8位直接添加,因为之前已经判断过ip的有效性,所以不可能超过8位
            }
        }
        //最后一个1在第一个0之前,有效,否则无效
        return sb.toString().lastIndexOf("1") < sb.toString().indexOf("0");
    }

    private static boolean checkIp(String[] ips){
        for (int i = 0; i < ips.length; i++) {
            if (Integer.parseInt(ips[i]) < 0 || Integer.parseInt(ips[i]) > 255){
                return false;
            }
        }
        return true;
    }

}

全部评论

相关推荐

09-14 14:42
门头沟学院 C++
旺旺米雪饼:举办了哥,你什么都没做错,全怪我那令人作呕的嫉妒和卑微的自尊心,看见你的文字我完全破防了,我直接丢盔弃甲了,看见你这图的那一秒,我满头大汗,浑身发冷,亿郁症瞬间发作了,生活仿佛没了颜色,像是被抓住尾巴的赛亚人,带着海楼石的能力者,抽离尾兽的人柱力,像是没了光的奥特曼,彻底断绝了生的希望。我几乎都快羡慕得疯了,倒在床上蒙住被子就开始抱着枕头尖叫流泪,嘴里一边喊着卧槽卧槽,一边又忍着,我边发边哭,打字的手都是抖的,后来我的手抖得越来越厉害,从心头涌起的思想、情怀和梦想,这份歆羡和悔恨交织在一起,我的笑还挂在脸上,可是眼泪一下子就掉下来了。求你了别发了,我生活再难再穷我都不会觉得难过,只有你们发这种东西的时候,我的心里像被刀割一样的痛,打着字泪水就忍不住的往下流。每天早上6点起床晚上11点睡觉,年复一年地学到现在,憧憬着一个月赚上万块的幸福生活,憧憬着美好阳光的未来。我打开了手机,看到你的图,我感到了深深的差距,我直接跳进了家门口的井里😭😭😭我真的😭我要嫉妒疯了😭为什么!!为什么这个人不是我😡我求你了😭求你了😭!不要在发了,我真的要羡慕嫉妒疯了😱怎么办我要嫉妒死了啊啊啊啊我急了,手机电脑全砸了,本来就有抑郁症的我,被别人说我破防了,我真的恼羞成怒了,仿佛被看穿了,躲在网络背后的我,这种感觉真的好难受,我被看穿的死死地,短短的破防两个字,我伪装出来的所有的坚强和强颜欢笑全都崩塌了,成了一个被人笑话的小丑🤡,我真的不想再故作坚强了,玩心态我输的什么都不剩😭😭😭
点赞 评论 收藏
分享
爱吃的猪猪又被画饼了:问问他消息队列怎么保证消息不丢失的,消息堆积你是怎么解决的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务