题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
//输入数据
List<String> list = new ArrayList<>();
while(in.hasNextLine()){
String s = in.nextLine();
list.add(s);
} //接受到list中
int[] ans = new int[7];
for(String s : list){
String[] ipAndMask = s.split("~");
String[] ipAddress = ipAndMask[0].split("\\.");
String[] mask = ipAndMask[1].split("\\.");
int a = Integer.valueOf(ipAddress[0]) & Integer.valueOf(mask[0]);
if(a==0 || a==127){
continue;
}
if(!isWrong(s, ipAndMask, ipAddress, mask)){
ans[5]+=1;
continue;
}
if(isPrivate(s, ipAndMask, ipAddress, mask)){
ans[6]+=1;
}
if(netClasses(s, ipAndMask, ipAddress, mask)!=-1){
ans[netClasses(s, ipAndMask, ipAddress, mask)]+=1;
}
}
for(int i=0 ; i<7 ; ++i){
System.out.print(ans[i]+" ");
}
}
public static boolean isWrong(String s, String[] ipAndMask, String[] ipAddress, String[] mask){
StringBuilder ismask = new StringBuilder(""); //判断是否前面权威1
if(ipAddress.length!=4 || mask.length!=4){ //不足四位
return false;
}
if(mask[0].equals("255") && mask[1].equals("255") &&mask[2].equals("255") &&mask[3].equals("255") ) {
return false;
}
for(int i=0 ; i < ipAddress.length ; ++i){
int h1 = Integer.valueOf(ipAddress[i]);
int h2 = Integer.valueOf(mask[i]);
int h = h1&h2;
if(h<0 || h>255){
return false;
}
if(h2 < 0 || h2>255){
return false;
}
int b = 1<<8;
h2 = h2|b;
ismask.append(Integer.toBinaryString(h2).substring(1));
}
String mask1 = ismask.toString();
for(int i=1 ; i<mask1.length(); ++i){
if(mask1.charAt(i-1) == '0' && mask1.charAt(i) == '1'){
return false; //子网掩码有前0后1的情况
}
}
return true;
}
public static boolean isPrivate(String s, String[] ipAndMask, String[] ipAddress, String[] mask){
int[] netAddress = new int[4];
for(int i=0 ; i<ipAddress.length ; ++i){
int h1 = Integer.valueOf(ipAddress[i]);
int h2 = Integer.valueOf(mask[i]);
int h = h1&h2;
netAddress[i] = h;
}
if(netAddress[0] == 10){
return true;
}
if(netAddress[0] == 172 && netAddress[1]>=16 && netAddress[1]<=31){
return true;
}
if(netAddress[0] == 192 && netAddress[1] == 168){
return true;
}
return false;
}
public static int netClasses(String s, String[] ipAndMask, String[] ipAddress, String[] mask){
int[] netAddress = new int[4];
for(int i=0 ; i<ipAddress.length ; ++i){
int h1 = Integer.valueOf(ipAddress[i]);
int h2 = Integer.valueOf(mask[i]);
int h = h1&h2;
netAddress[i] = h;
}
if(netAddress[0] >= 1 && netAddress[0]<=126){
return 0;
}
if(netAddress[0]>=128 && netAddress[0]<=191){
return 1;
}
if(netAddress[0]>=192 && netAddress[0]<=223){
return 2;
}
if(netAddress[0]>=224&&netAddress[0]<=239){
return 3;
}
if(netAddress[0] >=240 && netAddress[0]<=255){
return 4;
}
return -1;
}
}
查看14道真题和解析