华为机试---识别有效的IP地址和掩码并进行分类统计
程序员文章站
2024-03-12 12:18:32
...
题目描述:
请解析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就是一个非法的掩码)
本题暂时默认以0开头的IP地址是合法的,比如0.1.1.2,是合法地址
输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
示例1
输入
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
解题思路:
首先对输入的IP和掩码进行判断是否格式正确,若不正确,不合法的地址和掩码单独归类加1并结束当前的循环,否则继续执行;
然后判断掩码的是否是非法的掩码,如果是,不合法的地址和掩码单独归类加1并结束当前的循环,否则继续执行;
根据A、B、C、D、E的格式判断IP是属于哪一种类型,以及私网IP地址的判断。
代码实现:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int A=0;
int B=0;
int C=0;
int D=0;
int E=0;
int error=0;
int pIp=0;
while(sc.hasNext()){
String inputIp = sc.nextLine();
String[] ipMaskCode = inputIp.split("~");
String ip=ipMaskCode[0];
String maskCode = ipMaskCode[1];
if(!isValidFormat(ip) || !isValidFormat(maskCode)){
error++;
continue;
}
if(!validMaskCode(maskCode)){
error++;
continue;
}
String[] str = ip.split("\\.");
String fnStr = str[0];
int fn = Integer.valueOf(fnStr);
if(fn>0 && fn<127){
A++;
}
if(fn>127 && fn<192){
B++;
}
if(fn>191 && fn<224){
C++;
}
if(fn>223 && fn<240){
D++;
}
if(fn>239 && fn<=255){
E++;
}
String snStr = str[1];
int sn = Integer.valueOf(snStr);
if(fn==10){
pIp++;
}
if(fn==172 && sn>=16 && sn<=31){
pIp++;
}
if(fn==192 && sn==168){
pIp++;
}
}
System.out.println(A+" "+B+" "+C+" "+D+" "+E+" "+error+" "+pIp);
}
//判断有效格式
public static boolean isValidFormat(String ip){
String[] nums = ip.split("\\.");
if(nums.length!=4){
return false;
}
for(int i=0;i<nums.length;i++){
int n=Integer.parseInt(nums[i]);
if(n<0 || n>255){
return false;
}
}
return true;
}
//判断有效掩码
public static boolean validMaskCode(String maskCode){
String[] codes = maskCode.split("\\.");
StringBuilder mask = new StringBuilder();
for(int i=0;i<4;i++){
int n=Integer.valueOf(codes[i]);
mask.append(binaryString(n));
}
int i1 = mask.lastIndexOf("1");
int i2 = mask.indexOf("0");
if(i1>i2){
return false;
}
return true;
}
//int转八位二进制字符串
public static String binaryString(int n){
StringBuilder bs = new StringBuilder();
String temp = Integer.toBinaryString(n);
if(temp.length()<8){
for(int i=0;i<8-temp.length();i++){
bs.append("0");
}
bs.append(temp);
return (bs.toString());
}
return temp;
}
}
每次看到这样的结果,都有一种感动要哭的感觉