题解 | #识别有效的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;
    }

}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务