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

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

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

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
/**这里先判断了ip的有效和分类,再判断了掩码的有效,顺序反过来可能会更好。
*/
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<String> arr = new ArrayList<>();
        while (sc.hasNext()) {
            String s=sc.next();
            arr.add(s);
        }

        int[] n = new int[7];//7个标志
        //A,B,C,D,E,错误ip或错误掩码,私有ip

        for (int i = 0; i < arr.size(); i++) {
            String[] ip = arr.get(i).split("~");
            String[] s1 = ip[0].split("\\."); //ip
            String[] s2 = ip[1].split("\\.");//掩码
           //1.判断是否是四个数,不是则错误
            if (s1.length < 4 || s2.length < 4) n[5] += 1;
            else {
                int[] temp = isLegal(ip); //每一对的返回结果
                for (int j = 0; j < 7; j++) {
                    n[j] += temp[j];
                }
            }
        }
        for (int i : n) {
            System.out.print(i + " ");
        }
    }

    public static int[] isLegal(String[] s) {
        int[] n = new int[7];
        String[] s1 = s[0].split("\\."); //ip
        String[] s2 = s[1].split("\\.");//掩码
        int[] ip = new int[4];
        for (int i = 0; i < 4; i++) {
            ip[i] = Integer.parseInt(s1[i]);
        }
        if (ip[0] == 0 || ip[0] == 127) {
            return n;
        } // 忽略ip的情况 ,此时未考虑掩码的情况
        //1.考虑ip地址和私有地址 
          
        if (ip[0] >= 1 && ip[0] <= 126) { //A
            boolean pip = false; //私有ip
            if (ip[0] == 10) pip = true;
            int flag = 0; //后面三位
            for (int i = 1; i < 4; i++) {
                if (ip[i] >= 0 && ip[i] <= 255) flag++;
            }
            if (flag == 3) n[0] = 1;
            else n[5] = 1;
            if (flag == 3 && pip) n[6] = 1;
        } else if (ip[0] >= 128 && ip[0] <= 191) {//B
            boolean pip = false; //私有ip
            if (ip[0] == 172 && ip[1] >= 16 && ip[1] <= 31) pip = true;
            int flag = 0; //后面三位
            for (int i = 1; i < 4; i++) {
                if (ip[i] >= 0 && ip[i] <= 255) flag++;
            }
            if (flag == 3) n[1] = 1;
            if (flag == 3 && pip) n[6] = 1;
        } else if (ip[0] >= 192 && ip[0] <= 223) { //C
            boolean pip = false; //私有ip
            if (ip[0] == 192 && ip[1] == 168) pip = true;
            int flag = 0; //后面三位
            for (int i = 1; i < 4; i++) {
                if (ip[i] >= 0 && ip[i] <= 255) flag++;
            }
            if (flag == 3) n[2] = 1;
            else n[5] = 1;
            if (flag == 3 && pip) n[6] = 1;
        } else if (ip[0] >= 224 && ip[0] <= 239) { //D
            int flag = 0; //后面三位
            for (int i = 1; i < 4; i++) {
                if (ip[i] >= 0 && ip[i] <= 255) flag++;
            }
            if (flag == 3) n[3] = 1;
            else n[5] = 1;
        } else if (ip[0] >= 240 && ip[0] <= 255) { //E
            int flag = 0; //后面三位
            for (int i = 1; i < 4; i++) {
                if (ip[i] >= 0 && ip[i] <= 255) flag++;
            }
            if (flag == 3) n[4] = 1;
            else n[5] = 1;
        } else {  //错误ip    
            n[5] = 1;
        }
        //判断掩码
        //首先判断是否ip错误,错误则不用判断掩码是否错误
       //全是0和全是1也为非法掩码
        if (n[5] == 1) return n;
        LinkedList<Integer> b = new LinkedList<>();
        for (int i = 3; i >= 0; i--) {
            int j = Integer.parseInt(s2[i]);
            if (j > 255) {
                n = new int[7];
                n[5] = 1;
                return n;
            }
            for (int k = 7; k >= 0; k--) {
                b.add(j % 2);
                j /= 2;
            }
        }
        boolean flag = false;
        int first1 = 31;
        int num=0;
        for (int i = 0; i < b.size(); i++) {
            if(b.get(i)==1) num++;
            if (!flag && b.get(i) == 1) {
                flag = true; //为1;
                first1 = i;  //从右开始第一个1的下标
            }
            if (b.get(i) == 0 && i > first1) {
                n = new int[7];
                n[5] = 1;
            }
        }
        if(num==32||num==0) { //全0和全1
            n = new int[7];
            n[5] = 1;
        }
        return n;
    }

}

全部评论

相关推荐

03-04 07:14
门头沟学院 C++
黑皮白袜臭脚体育生:老板:都给工作机会了还想要工资,哪来这么多好事
点赞 评论 收藏
分享
03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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