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

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

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

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
       int[] res = new int[]{0,0,0,0,0,0,0};
        Scanner in = new Scanner(System.in);
        while (in.hasNext()){
                String str = in.nextLine();   //似乎第一个输入必须放在这个while下面,所以之前写的二次嵌套循环会出问题
                if (str.equals("")) break;
                else {
                    String[] gg = str.split("~");
                    String[] ip = gg[0].split("\\.");
                    String[] ym = gg[1].split("\\.");
                    if (ip.length!=4||ym.length!=4) {
                        res[5] = res[5]+1;
                        continue;
                    }
                    //先判断是否非法
                    int[] ip_math = new int[4];
                    int[] ym_math = new int[4];
                    boolean pan1 = false;//判断Ip和掩码里是否有空的
                    for (int i = 0;i<4;i++){
                        if (ip[i].equals("") ||ym[i].equals("")){
                            pan1 = true;
                            break;
                        }
                        ip_math[i] = Integer.parseInt(ip[i]);
                        ym_math[i] = Integer.parseInt(ym[i]);
                    }
                    if (pan1){
                        res[5] = res[5]+1;
                        continue;
                    }
                    //判断Ip和掩码数值范围
                    if (ip_math[0]==0||ip_math[0]==127) continue;
                    boolean pan2 = false;
                    for (int i=0;i<4;i++){
                        int ymm = ym_math[i];
                        if (ip_math[i]>255||ip_math[i]<0
                        ||(ymm!=0&&ymm!=128&&ymm!=192&&ymm!=224&&ymm!=240&&ymm!=248&&ymm!=252&&ymm!=254&&ymm!=255)) {
                            pan2 = true;
                            break;
                        }
                    }//用循环去一位一位校验二进制掩码会题目会超时
                    if (pan2){
                        res[5] = res[5]+1;
                        continue;
                    }
                    //判断掩码
                    if (ym_math[3]==255||ym_math[0]==0) {
                        res[5] = res[5]+1;
                        continue;
                    };
                    boolean pan3 = false;
                    int aa = 0;
                    for(int i = 3;i>=0;i--){
                        if (i>0&&ym_math[i]>ym_math[i-1]) {
                            pan3 = true;
                            break;
                        }
                        if (ym_math[i]!=0&&ym_math[i]<128){
                            pan3 = true;
                            break;
                        }else if (ym_math[i]==0) continue;
                    }
                    if (pan3){
                        res[5] = res[5]+1;
                        continue;
                    }
                    //分类IP,先私有再分类
                    if (ip_math[0]==10||(ip_math[0]==172&&ip_math[1]>15&&ip_math[1]<32)||(ip_math[0]==192&&ip_math[1]==168))
                        res[6]=res[6]+1;
                    if (ip_math[0]<127) {
                        res[0] = res[0]+1;
                        continue;
                    }
                    if (ip_math[0]<192){
                        res[1] = res[1]+1;
                        continue;
                    }
                    if (ip_math[0]<224){
                        res[2] = res[2]+1;
                        continue;
                    }
                    if (ip_math[0]<240){
                        res[3] = res[3]+1;
                        continue;
                    }
                    res[4] = res[4] + 1;
                }
            }
            for (int b:res){
                System.out.print(b+" ");
            }
    }
}

全部评论

相关推荐

10-17 17:14
门头沟学院 C++
牛客410039819号:北京地区大多是919和927,这两场挂太多人了
投递华为等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务