题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
编码 30min,调试 1 小时,全是判断子网掩码的代码出 bug,调了快一个点,我是不是太菜了,要写这么久。感觉判断子网掩码的代码自己写的很傻杯。
import java.util.Arrays; import java.util.List; import java.util.Scanner; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { private static final int A = 1; private static final int B = 2; private static final int C = 4; private static final int D = 8; private static final int E = 16; private static final int ERR = 32; private static final int PRI = 64; private static final int IGNORE = 128; public static void main(String[] args) { Scanner in = new Scanner(System.in); int a = 0, b = 0, c = 0, d = 0, e = 0, err = 0, pri = 0; while (in.hasNextLine()) { String[] arr = in.nextLine().split("~"); String ip = arr[0]; String mask = arr[1]; int ipc = validIP(ip); if (!validMASK(mask)) { if (ipc != IGNORE) err++; continue; } // valid ip ? switch (ipc) { case A: a++; break; case A | PRI: a++; pri++; break; case B: b++; break; case B | PRI: b++; pri++; break; case C: c++; break; case C | PRI: c++; pri++; break; case D: d++; break; case E: e++; break; case ERR: err++; break; case PRI: pri++; break; case IGNORE: break; } // valid mask ? } System.out.println(a + " " + b + " " + c + " " + d + " " + e + " " + err + " " + pri); } public static boolean validMASK(String mask) { List<Integer> valid = Arrays.asList(128, 192, 224, 240, 248, 252, 254, 255, 0); String[] arr = mask.split("\\."); int a = Integer.parseInt(arr[0]); int b = Integer.parseInt(arr[1]); int c = Integer.parseInt(arr[2]); int d = Integer.parseInt(arr[3]); if (!valid.contains(b)) { return false; } else { if (b == 255) { if (!valid.contains(c)) { return false; } else { if (c == 255) { if (!valid.contains(d)) return false; if (d == 255) return false; } else { if (d > 0) return false; } } } else { if (c > 0 || d > 0) return false; } } return true; } public static int validIP(String ip) { Pattern pattern = Pattern.compile("(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})"); Matcher matcher = pattern.matcher(ip); if (matcher.matches()) { int a = Integer.parseInt(matcher.group(1)); if (a == 0 || a == 127) return IGNORE; int b = Integer.parseInt(matcher.group(2)); if (a >= 1 && a <= 126) { if (a == 10) return A | PRI; else return A; } if (a >= 128 && a <= 191) { if (a == 172 && b >= 16 && b <= 31) return B | PRI; else return B; } if (a >= 192 && a <= 223) { if (a == 192 && b == 168) return C | PRI; else return C; } if (a >= 224 && a <= 239) { return D; } if (a >= 240 && a <= 255) { return E; } } return ERR; } }