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