Java机试题:识别有效的IP地址和掩码并进行分类统计
描述
请解析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地址和掩码,用~隔开。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
处理需要注意点:
1、如果是0...* 或 127...* 跳过,这一步必须做,否则错误码会统计多
2、掩码的判断,需要转化为二进制,并且需要补足8位
3、私有ip和adcde类型的,不是互斥的,可以同时满足私有和abcde中的一种;
import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; int error = 0; int pri = 0; while (in.hasNextLine()) { String[] str = in.nextLine().split("~"); String ip = str[0]; String ipSun = str[1]; String type = categroyIp(ip,ipSun); switch (type) { case "a": a++; break; case "b": b++; break; case "c": c++; break; case "d": d++; break; case "e": e++; break; case "error": error++; break; case "pria": pri++; a++; break; case "prib": pri++; b++; break; case "pric": pri++; c++; break; default: break; } } System.out.print(a + " "); System.out.print(b + " "); System.out.print(c + " "); System.out.print(d + " "); System.out.print(e + " "); System.out.print(error + " "); System.out.print(pri + " "); } public static String categroyIpSon(String ipSun) { String ret = ""; String[] ipStr = ipSun.split("\\."); StringBuffer sb = new StringBuffer(); for (int i = 0; i < ipStr.length; i++) { sb.append(String.format("%08d",Integer.valueOf(Integer.toBinaryString(Integer.valueOf(ipStr[i]))) )); } if(sb.charAt(0) != '1') { ret = "error"; }else if(sb.indexOf("0") < 0) { ret = "error"; } else { boolean zeroOut = false; if(sb.indexOf("0") < sb.lastIndexOf("1")) { ret = "error"; } } return ret; } public static String categroyIp(String ip,String ipSun) { String[] ipStr = ip.split("\\."); String ret = ""; //类似于【0.*.*.*】和【127.*.*.*】忽略,这个条件要放在最前面,否则错误掩码会统计多 if(ipStr[0].equals("0") || ipStr[0].equals("127")){ return ""; } if(ipStr.length < 4 || categroyIpSon(ipSun).equals("error")) { ret = "error"; } else { int eleven = Integer.valueOf(ipStr[0]); int twelve = Integer.valueOf(ipStr[1]); int thirteen = Integer.valueOf(ipStr[2]); int fourteen = Integer.valueOf(ipStr[3]); if(twelve >= 0 && twelve <= 255 && thirteen >= 0 && thirteen <= 255 && fourteen >= 0 && fourteen <= 255) { if(eleven >= 0 && eleven <= 126) { if(eleven == 10) { ret = "pria"; } else { ret = "a"; } } else if(eleven >= 128 && eleven <= 191) { if(eleven == 172 && twelve >= 16 && twelve <= 31) { ret = "prib"; } else { ret = "b"; } } else if(eleven >= 192 && eleven <= 223) { if(eleven == 192 && twelve == 168) { ret = "pric"; } else { ret = "c"; } } else if(eleven >= 224 && eleven <= 239) { ret = "d"; } else { ret = "e"; } } } return ret; } }
题目来源:牛客网
浙公网安备 33010602011771号