题解 HJ18| #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int A, B, C, D, E, F, I; A = 0;//A、B、C、D、E类IP B = 0; C = 0; D = 0; E = 0; F = 0;//F是False的数量 I = 0;//I是私有IP的数量 while (in.hasNextLine()) { String str; str = in.nextLine(); String[] sp = str.split("~"); if (sp.length != 2) { F++; break; }//按照波浪号分割 String[] ip1 = sp[0].split("\\.");//按照.来分割,.是特殊字符,需要用\\来转义 String[] son1 = sp[1].split("\\."); int[] ip = new int[4]; int[] son = new int[4]; if (ip1.length == 4 && son1.length == 4) {//防止有缺漏,有的没有没有四个 for (int i = 0; i < ip1.length; i++)ip[i] = Integer.parseInt(ip1[i]); for (int i = 0; i < son1.length; i++)son[i] = Integer.parseInt(son1[i]);//将IP和子网掩码son用Integer.parseInt转换成int类型 //ip判定 //接下来是一个隐藏难点,子网掩码转换成二进制要在前面补0,不满八位补成八位 if (son[0] >= 0 && son[0] <= 255 && son[1] >= 0 && son[1] <= 255 && son[2] >= 0 && son[2] <= 255 && son[3] >= 0 && son[3] <= 255) { String bit1 = Integer.toBinaryString(son[0]) ; String bit; for (int i = 0; bit1.length() + i < 8; i++) { bit1 = "0" + bit1; } bit = bit1; bit1 = Integer.toBinaryString(son[1]) ; for (int i = 0; bit1.length() + i < 8; i++) { bit1 = "0" + bit1; } bit = bit + bit1; bit1 = Integer.toBinaryString(son[2]) ; for (int i = 0; bit1.length() + i < 8; i++) { bit1 = "0" + bit1; } bit = bit + bit1; bit1 = Integer.toBinaryString(son[3]) ; for (int i = 0; bit1.length() + i < 8; i++) { bit1 = "0" + bit1; } bit = bit + bit1; //补完之后判断子网掩码是否合规,合规则t=0,继续判断IP;否则t!=0,如果ip不是1/127则F++,错误加一 int j = 0, t = 0; for (int i = 0; i < bit.length(); i++) { if (bit.charAt(0) == '0' || bit.charAt(bit.length() - 1) == '1') { t++; if (ip[0] != 0 && ip[0] != 127) { F++; } break; } if (bit.charAt(i) == '0') { j = i + 1; break; } } if (j != 0) { for (; j < bit.length(); j++) { if (bit.charAt(j) == '1') { if (ip[0] != 0 && ip[0] != 127) F++; t++; break; } } } ipcompare://这一段是ip比较,达成任意一个条件都可以跳出判断,如过是特殊字符的ip直接F++ if (t == 0) { if (ip[0] == 0 || ip[0] == 127) { break ipcompare; } if (ip[0] >= 1 && ip[0] <= 126) { if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 && ip[3] <= 255)A++; else F++; } else if (ip[0] >= 128 && ip[0] <= 191) { if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 && ip[3] <= 255)B++; else F++; } else if (ip[0] >= 192 && ip[0] <= 223) { if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 && ip[3] <= 255)C++; else F++; } else if (ip[0] >= 224 && ip[0] <= 239) { if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 && ip[3] <= 255)D++; else F++; } else if (ip[0] >= 240 && ip[0] <= 255) { if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 && ip[3] <= 255)E++; else F++; } else F++; //这一点是判断是否是私有ip if (ip[0] == 10) { if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 && ip[3] <= 255)I++; } if (ip[0] == 172) { if (ip[1] >= 16 && ip[1] <= 31 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 && ip[3] <= 255)I++; } if (ip[0] == 192) { if (ip[1] == 168 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 && ip[3] <= 255)I++; } } } else {//无论子网掩码是否是符合的数字,都要判断是否是1.127的开头ip ip[0] = Integer.parseInt(ip1[0]); if (ip[0] != 0 && ip[0] != 127) F++; } } else {//无论ip和子网是否长度合规,也都判断一下 ip[0] = Integer.parseInt(ip1[0]); if (ip[0] != 0 && ip[0] != 127) F++; } } //输出结果 System.out.print(A); System.out.print(' '); System.out.print(B); System.out.print(' '); System.out.print(C); System.out.print(' '); System.out.print(D); System.out.print(' '); System.out.print(E); System.out.print(' '); System.out.print(F); System.out.print(' '); System.out.print(I); } }
这题难点比较杂
先定义要输出的几个参数
int A, B, C, D, E, F, I;
A = 0;//A、B、C、D、E类IP
B = 0;
C = 0;
D = 0;
E = 0;
F = 0;//F是False的数量
I = 0;//I是私有IP的数量
首先接收到字符串需要进行分割,分割成俩个字符串
String str;
str = in.nextLine();
String[] sp = str.split("~");
if (sp.length != 2) {
F++;
break;
}//按照波浪号分割
其次是每个字符串要接着按照.进行分割
坑点一:.在java中不是可以直接进行分割的,要加入\\进行转义
String[] ip1 = sp[0].split("\\.");//按照.来分割,.是特殊字符,需要用\\来转义
String[] son1 = sp[1].split("\\.");
之后是因为ip要比较的范围是整数型,还要将之转化为整数
坑点二:因为有1..0.,这样在进行分割之后并不会填满4个,长度会短,这样在后面会产生越界
int[] ip = new int[4];
int[] son = new int[4];
if (ip1.length == 4 && son1.length == 4) {//防止有缺漏,有的没有没有四个
for (int i = 0; i < ip1.length; i++)ip[i] = Integer.parseInt(ip1[i]);
for (int i = 0; i < son1.length; i++)son[i] = Integer.parseInt(son1[i]);
之后还要将子网掩码改成二进制型,这里一定要注意,子网掩码都是八位数,所以要补0
坑点三:子网掩码转化为二进制之后,在前面补0,先判断int型son里面数字是否是0-255之间
if (son[0] >= 0 && son[0] <= 255 && son[1] >= 0 && son[1] <= 255 &&
son[2] >= 0 && son[2] <= 255 && son[3] >= 0 &&
son[3] <= 255) {
String bit1 = Integer.toBinaryString(son[0]) ;
String bit;
for (int i = 0; bit1.length() + i < 8; i++) {
bit1 = "0" + bit1;
}
bit = bit1;
bit1 = Integer.toBinaryString(son[1]) ;
for (int i = 0; bit1.length() + i < 8; i++) {
bit1 = "0" + bit1;
}
bit = bit + bit1;
bit1 = Integer.toBinaryString(son[2]) ;
for (int i = 0; bit1.length() + i < 8; i++) {
bit1 = "0" + bit1;
}
bit = bit + bit1;
bit1 = Integer.toBinaryString(son[3]) ;
for (int i = 0; bit1.length() + i < 8; i++) {
bit1 = "0" + bit1;
}
bit = bit + bit1;
之后就是进行判断掩码是否合规
//补完之后判断子网掩码是否合规,合规则t=0,继续判断IP;否则t!=0,如果ip不是1/127则F++,错误加一
int j = 0, t = 0;
for (int i = 0; i < bit.length(); i++) {
if (bit.charAt(0) == '0' || bit.charAt(bit.length() - 1) == '1') {
t++;
if (ip[0] != 0 && ip[0] != 127) {
F++;
}
break;
}
if (bit.charAt(i) == '0') {
j = i + 1;
break;
}
}
if (j != 0) {
for (; j < bit.length(); j++) {
if (bit.charAt(j) == '1') {
if (ip[0] != 0 && ip[0] != 127) F++;
t++;
break;
}
}
}
ipcompare://这一段是ip比较,达成任意一个条件都可以跳出判断,如过是特殊字符的ip直接F++
子网掩码合规之后再进行判断ip
坑点四,ip为0和127的,都不算在违规里面,不能算F++
if (t == 0) {
if (ip[0] == 0 || ip[0] == 127) {
break ipcompare;
}
if (ip[0] >= 1 && ip[0] <= 126) {
if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 &&
ip[3] <= 255)A++;
else F++;
} else if (ip[0] >= 128 && ip[0] <= 191) {
if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 &&
ip[3] <= 255)B++;
else F++;
} else if (ip[0] >= 192 && ip[0] <= 223) {
if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 &&
ip[3] <= 255)C++;
else F++;
} else if (ip[0] >= 224 && ip[0] <= 239) {
if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 &&
ip[3] <= 255)D++;
else F++;
} else if (ip[0] >= 240 && ip[0] <= 255) {
if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 &&
ip[3] <= 255)E++;
else F++;
} else F++;
//这一点是判断是否是私有ip
if (ip[0] == 10) {
if (ip[1] >= 0 && ip[1] <= 255 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 &&
ip[3] <= 255)I++;
}
if (ip[0] == 172) {
if (ip[1] >= 16 && ip[1] <= 31 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 &&
ip[3] <= 255)I++;
}
if (ip[0] == 192) {
if (ip[1] == 168 && ip[2] >= 0 && ip[2] <= 255 && ip[3] >= 0 &&
ip[3] <= 255)I++;
}
}
} else {//无论子网掩码是否是符合的数字,都要判断是否是1.127的开头ip
ip[0] = Integer.parseInt(ip1[0]);
if (ip[0] != 0 && ip[0] != 127) F++;
}
} else {//无论ip和子网是否长度合规,也都判断一下
ip[0] = Integer.parseInt(ip1[0]);
if (ip[0] != 0 && ip[0] != 127) F++;
}
}
最后输出System.out.print(A);
System.out.print(' ');
System.out.print(B);
System.out.print(' ');
System.out.print(C);
System.out.print(' ');
System.out.print(D);
System.out.print(' ');
System.out.print(E);
System.out.print(' ');
System.out.print(F);
System.out.print(' ');
System.out.print(I);
#华为od题库#随便发发而已