欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

华为机试---识别有效的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;
    }
}
每次看到这样的结果,都有一种感动要哭的感觉
华为机试---识别有效的IP地址和掩码并进行分类统计