题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 7种情况,A,B,C,D,E,错误IP/错误子网掩码,私有IP int error[] = new int[7]; while (in.hasNextLine()) { String ipStr = in.nextLine(); if (ipStr.equals("")) { break; } // 以~分隔,分别判断2个IP的情况 String splitIps = ipStr.split("~")[0]; String splitMask = ipStr.split("~")[1]; // 判断是否出现0或者127打头的 if (splitIps.startsWith("0") || splitIps.startsWith("127")) { continue; } // 判断IP是否合法,以.分割,如果个数不为4,或者中间有空都是不合法的 if (!isIpLegal(splitIps) || !isMaskLegal(splitMask)) { error[5]++; continue; } // 判断为哪一类IP String[] ips = splitIps.split("\\."); Integer firstNum = Integer.parseInt(ips[0]); // A类 if (firstNum >= 1 && firstNum <= 126) { error[0]++; // 在A类中,从10.0.0.0到10.255.255.255为私有IP if (firstNum == 10) { error[6]++; } } // B类 if (firstNum >= 128 && firstNum <= 191) { error[1]++; // 在B类中,从172.16.0.0到172.31.255.255为私有IP Integer secondNum = Integer.parseInt(ips[1]); if (firstNum == 172 && secondNum >= 16 && secondNum <= 31) { error[6]++; } } // C类 if (firstNum >= 192 && firstNum <= 223) { error[2]++; // C类中,从192.168.0.0到192.168.255.255为私有IP Integer secondNum = Integer.parseInt(ips[1]); if (firstNum == 192 && secondNum == 168) { error[6]++; } } // D类 if (firstNum >= 224 && firstNum <= 239) { error[3]++; } // E类 if (firstNum >= 240 && firstNum <= 255) { error[4]++; } } output(error); } /** * 输出最终的结果 * * @param error 结果集 */ private static void output(int[] error) { StringBuilder sb = new StringBuilder(); for (int i : error) { sb.append(i).append(" "); } sb.deleteCharAt(sb.length() - 1); System.out.println(sb); } /** * 判断IP是否合法 * * @param splitIps 原始ID * @return 结果, true/false */ private static boolean isIpLegal(String splitIps) { String[] ips = splitIps.split("\\."); if (ips.length != 4) { return false; } for (String ip : ips) { if (ip.equals("")) { return false; } if (Integer.parseInt(ip) < 0 || Integer.parseInt(ip) > 255) { return false; } } return true; } /** * 判断子网掩码是否合法 * * @param splitMask 原始子网掩码 * @return */ private static boolean isMaskLegal(String splitMask) { if (!isIpLegal(splitMask)) { return false; } String[] masks = splitMask.split("\\."); // 每一段数量转成二进制字符串,再进行判断是否合法 String bitStr = toBinaryStr(masks[0]) + toBinaryStr(masks[1]) + toBinaryStr(masks[2]) + toBinaryStr(masks[3]); if (!bitStr.matches("1+0+")) { return false; } return true; } private static String toBinaryStr(String numStr) { String bitStr = Integer.toBinaryString(Integer.parseInt(numStr)); while (bitStr.length() < 8) { bitStr = "0" + bitStr; } return bitStr; } }