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