题解 | #识别有效的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+" ");
}
}
}
查看17道真题和解析