题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int wrongCount = 0; int aCount = 0; int bCount = 0; int cCount = 0; int dCount = 0; int eCount = 0; int privateCount = 0; while (in.hasNextLine()) { String str = in.nextLine(); List ipList = new ArrayList<>(); // 如果输入的行为空,就结束循环 if (str.isEmpty()) { break; } boolean isEmptyFlag = false; for (String ipPart : str.split("~")[0].split("\\.")) { if (ipPart.isEmpty()) { isEmptyFlag = true; } ipList.add(ipPart); } if (isEmptyFlag) { wrongCount++; continue; } // 忽略0或127 if(ipList.get(0).equals("0") || ipList.get(0).equals("127")){ continue; } // 错误IP地址或错误掩码识别 if (wrongIp(str)) { wrongCount++; continue; } // ABCDE 识别 int firstIp = Integer.valueOf(ipList.get(0).toString()); int secondIp = Integer.valueOf(ipList.get(1).toString()); if (firstIp >= 1 && firstIp <= 126) { // A aCount++; } if (firstIp >= 128 && firstIp <= 191) { // B bCount++; } if (firstIp >= 192 && firstIp <= 223) { // C cCount++; } if (firstIp >= 224 && firstIp <= 239) { // D dCount++; } if (firstIp >= 240 && firstIp <= 255) { // E eCount++; } // 私有的 if (firstIp == 10 || (firstIp == 172 && (secondIp >= 16 && secondIp <= 31)) || (firstIp == 192 && secondIp == 168)) { privateCount++; } } System.out.print(aCount + " "); System.out.print(bCount + " "); System.out.print(cCount + " "); System.out.print(dCount + " "); System.out.print(eCount + " "); System.out.print(wrongCount + " "); System.out.print(privateCount); } public static boolean wrongIp(String str) { String regex = "1+0+"; String binaryStr = ""; // 错误IP地址或错误掩码识别 for (String maskPart : str.split("~")[1].split("\\.")) { if (maskPart.isEmpty()) { return true; } String binaryIp = Integer.toBinaryString(Integer.valueOf(maskPart)); // 如果不是八位则补全 while (binaryIp.length() < 8) { binaryIp = "0".concat(binaryIp); } binaryStr += binaryIp; } if (!binaryStr.matches(regex)) { return true; } return false; } }