华为机试---识别有效的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就是一个非法的掩码)
本题暂时默认 以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;
    }
}
每次看到这样的结果,都有一种感动要哭的感觉


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值