题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int[] arr = new int[7]; out: while(scanner.hasNext()){ String str = scanner.nextLine(); String[] splits = str.split("~"); if(splits.length != 2){ arr[5]++; continue; } //判断IP地址是否有错误 String[] ip = splits[0].split("\\."); if(ip.length != 4){ arr[5]++; continue; } int[] ipNum = new int[4]; for(int i = 0; i < 4; i++){ if(!ip[i].isEmpty()){ int num = Integer.parseInt(ip[i]); if(num >= 0 && num <= 255){ ipNum[i] = num; }else{ arr[5]++; continue out; } }else{ arr[5]++; continue out; } } //判断子网掩码是否有错误 String[] mark = splits[1].split("\\."); if(mark.length != 4){ arr[5]++; continue; } StringBuilder markStr = new StringBuilder(); for(int i = 0; i < 4; i++){ String s = Integer.toBinaryString(Integer.parseInt(mark[i])); if(s.length() < 8){ int j = s.length(); while(j < 8){ markStr.append("0"); j++; } } markStr.append(Integer.toBinaryString(Integer.parseInt(mark[i]))); } int n = markStr.length(); boolean flag0 = false; for(int i = 0; i < n; i++){ if(markStr.charAt(i) == '0'){ flag0 = true; }else{ if(flag0){//前面有0出现 arr[5]++; continue out; } } } if(!flag0){ arr[5]++; continue; } //判断网络类型 if(ipNum[0] >= 1 && ipNum[0] < 127){ arr[0]++; }else if(ipNum[0] >= 128 && ipNum[0] < 192){ arr[1]++; }else if(ipNum[0] >= 192 && ipNum[0] < 224){ arr[2]++; }else if(ipNum[0] >= 224 && ipNum[0] < 240){ arr[3]++; }else if(ipNum[0] >= 240 && ipNum[0] <= 255){ arr[4]++; } //判断私有IP if(ipNum[0] == 10 || (ipNum[0] == 172 && ipNum[1] >= 16 && ipNum[1] <= 31) || (ipNum[0] == 192 && ipNum[1] == 168)){ arr[6]++; } } scanner.close(); System.out.println(arr[0] + " " + arr[1] + " " + arr[2] + " " + arr[3] + " " + arr[4] + " " + arr[5] + " " + arr[6]); } }