题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.Scanner; /** * HJ18 识别有效的IP地址和掩码并进行分类统计 */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int aNum = 0; int bNum = 0; int cNum = 0; int dNum = 0; int eNum = 0; int errNum = 0; int privNum = 0; while (scanner.hasNextLine()) { String str = scanner.nextLine(); if (str.equals("")) { break; } String[] input = str.split("~"); int ipFirst = getIpSeg(input[0], 0); // 0和127开头的过滤掉不计数 if (ipFirst == 0 || ipFirst == 127) { continue; } // 非法IP和非法掩码计数 if (!isValidIp(input[0])) { errNum++; continue; } if (!isValidMask(input[1])) { errNum++; continue; } // ABCDE计数 if (ipFirst >= 1 && ipFirst <= 126) { aNum++; } if (ipFirst >= 128 && ipFirst <= 191) { bNum++; } if (ipFirst >= 192 && ipFirst <= 223) { cNum++; } if (ipFirst >= 224 && ipFirst <= 239) { dNum++; } if (ipFirst >= 240 && ipFirst <= 255) { eNum++; } //私有IP计数 int ipSecond = getIpSeg(input[0], 1); if (ipFirst == 10 || (ipFirst == 172 && ipSecond >= 16 && ipSecond <= 32) || (ipFirst == 192 && ipSecond == 168)) { privNum++; } } System.out.println(aNum + " " + bNum + " " + cNum + " " + dNum + " " + eNum + " " + errNum + " " + privNum); } static int getIpSeg(String ip, int index) { String[] arr = ip.split("\\."); return Integer.parseInt(arr[index]); } static boolean isValidIp(String ip) { String[] ipi = ip.split("\\."); if (ipi.length != 4) { return false; } for (String ss : ipi) { if (Integer.parseInt(ss) < 0 || Integer.parseInt(ss) > 255) { return false; } } return true; } static boolean isValidMask(String mask) { if (!isValidIp(mask)) { return false; } StringBuilder stringBuilder = new StringBuilder(); String[] maski = mask.split("\\."); for (String ss : maski) { String binary = Integer.toBinaryString(Integer.parseInt(ss)); binary = String.format("%08d", Integer.parseInt(binary)); stringBuilder.append(binary); } // 主机号为0(00000000)且在网络号(11111111)后 return stringBuilder.toString().lastIndexOf("1") < stringBuilder.toString().indexOf("0"); } }