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

