题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; int err = 0; int pri = 0; while (in.hasNextLine()) { // 注意 while 处理多个 case String str = in.nextLine(); String[] strArr = str.split("~"); String ip = strArr[0]; String mask = strArr[1]; boolean isIp = isIp(ip); boolean isMask = isMask(mask); if(isIgnore(ip)){ continue; } if(!isIp || !isMask){ err++; } if(isIp && isMask){ boolean isPri = isPrivate(ip); if(isPri){ pri++; } if(isA(ip)){ a++; } if(isB(ip)){ b++; } if(isC(ip)){ c++; } if(isD(ip)){ d++; } if(isE(ip)){ e++; } } } System.out.println(String.format("%d %d %d %d %d %d %d", a,b,c,d,e,err,pri)); } private static void print(int num){ for (int i = 31; i >= 0; i--) { System.out.print((num & (1 << i)) == 0? "0" : "1"); } System.out.println(); } private static int ipToInt(String str){ String[] strArr = str.split("\\."); int res = 0; for(String item: strArr){ res <<= 8; res = res + Integer.parseInt(item); } return res; } private static int stoi(String str){ return Integer.parseInt(str); } private static boolean isIgnore(String str){ String[] strArr = str.split("\\."); if("0".equals(strArr[0]) || "127".equals(strArr[0])){ return true; } return false; } private static boolean isInt(String str){ try{ Integer.parseInt(str); return true; }catch(Exception e){ return false; } } private static boolean isIp(String str){ String[] strArr = str.split("\\."); if(strArr.length != 4){ return false; } for(String item: strArr){ if(item.isEmpty() || !isInt(item) || stoi(item)>255){ return false; } } return true; } private static boolean isMask(String str){ int b = 0; String[] strArr = str.split("\\."); for(String item: strArr){ b = (b<<8) | stoi(item); } if(b == 0 || ~b == 0){ return false; } if((b|(~b+1)) != b){ return false; } return true; } private static boolean isPrivate(String str){ return isInRange(str, "10.0.0.0", "10.255.255.255") || isInRange(str, "172.16.0.0", "172.31.255.255") || isInRange(str, "192.168.0.0", "192.168.255.255"); } private static boolean isA(String str){ return isInRange(str, "1.0.0.0", "126.255.255.255"); } private static boolean isB(String str){ return isInRange(str, "128.0.0.0", "191.255.255.255"); } private static boolean isC(String str){ return isInRange(str, "192.0.0.0", "223.255.255.255"); } private static boolean isD(String str){ return isInRange(str, "224.0.0.0", "239.255.255.255"); } private static boolean isE(String str){ return isInRange(str, "240.0.0.0", "255.255.255.255"); } private static boolean isInRange(String a, String s, String e){ int intA = ipToInt(a); int intS = ipToInt(s); int intE = ipToInt(e); return intA >= intS && intA <= intE; } }