请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
A类地址从1.0.0.0到126.255.255.255;
B类地址从128.0.0.0到191.255.255.255;
C类地址从192.0.0.0到223.255.255.255;
D类地址从224.0.0.0到239.255.255.255;
E类地址从240.0.0.0到255.255.255.255
私网IP范围是:
从10.0.0.0到10.255.255.255
从172.16.0.0到172.31.255.255
从192.168.0.0到192.168.255.255
子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
(注意二进制下全是1或者全是0均为非法子网掩码)
注意:
1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
2. 私有IP地址和A,B,C,D,E类地址是不冲突的
多行字符串。每行一个IP地址和掩码,用~隔开。
请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
输入:
10.70.44.68~255.254.255.0 1.0.0.1~255.0.0.0 192.168.0.2~255.255.255.0 19..0.~255.255.255.0
复制输出:
1 0 1 0 0 2 1
复制说明:
10.70.44.68~255.254.255.0的子网掩码非法,19..0.~255.255.255.0的IP地址非法,所以错误IP地址或错误掩码的计数为2; 1.0.0.1~255.0.0.0是无误的A类地址; 192.168.0.2~255.255.255.0是无误的C类地址且是私有IP; 所以最终的结果为1 0 1 0 0 2 1
输入:
0.201.56.50~255.255.111.255 127.201.56.50~255.255.111.255
复制输出:
0 0 0 0 0 0 0
复制说明:
类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
解题思路:
现在题目是什么情况不清楚,按照这个题目的思路,主要是一个优先顺序和一个子网掩码判断的情况:优先是特殊ip不作处理;然后是子网掩码不对或是ip格式不对,其中子网掩码需要格外注意转换格式,有些要补充0添加到32位字符串;最后才是ip的分类,一个ip可以既是C类,也是私有IP。
具体代码:
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a, b, c, d, e, w, s; a = b = 0; c = d = 0; e = 0; w = s = 0; // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNext()) { // 注意 while 处理多个 case String n = in.nextLine(); String[] dd = n.split("~", 0); String[] ips = dd[0].split("\\.", -1); String[] masks = dd[1].split("\\.", -1); // 判断格式是否为4个字段(题目中没有说明,但我觉得可能会有这种陷阱) if (ips.length != 4 || masks.length != 4) { w++; continue; } int ip1Int = Integer.parseInt(ips[0]); // 判断是否为特殊ip if (ip1Int == 0 || ip1Int == 127) { continue; } // 转换子网掩码兼判断ip int i = 0; StringBuilder sb = new StringBuilder(); for ( ; i < 4 ; i++) { try { int t = Integer.parseInt(masks[i]); String ts = Integer.toBinaryString(t); for (int j = 0; j < 8-ts.length() ; j++) { sb.append("0"); } sb.append(ts); } catch (Exception ex) { // Not Do Anthing } if (ips[i].length() == 0) { break; } } // 判断ip是否有误 if (i < 4) { w++; continue; } // 判断子网掩码是否有误 String mask = sb.toString(); if (mask.contains("01") || mask.charAt(mask.length() - 1) == '1' || mask.charAt(0) == '0') { w++; continue; } // 分类A-E if (ip1Int < 127) { a++; } else if (ip1Int < 192) { b++; } else if (ip1Int < 224) { c++; } else if (ip1Int < 240) { d++; } else if (ip1Int < 256) { e++; } else { w++; } // 分类私有 int ip2Int = Integer.parseInt(ips[1]); if (ip1Int == 10 || (ip1Int == 172 && ip2Int > 15 && ip2Int < 33) || (ip1Int == 192 && ip2Int == 168)) { s++; } } System.out.println(a + " " + b + " " + c + " " + d + " " + e + " " + w + " " + s); } }