【华为机试019】识别有效的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,是合法地址

Java实现:

import java.util.*;
public class Main {
     public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int isA=0;
        int isB=0;
        int isC=0;
        int isD=0;
        int isE=0;
        int isEroor=0;
        int isPrivate=0;
         
        while(sc.hasNextLine()){
            String str=sc.nextLine();
            String[] ips=str.split("~");
             
            //判断掩码是否合法
            boolean isMask=false;
            String[] maskArr=ips[1].split("\\.");
            String binaryMask="";
            //形成掩码二进制字符串
            for(int i=0;i<maskArr.length;i++){
                String binaryStr=Integer.toBinaryString(Integer.parseInt(maskArr[i]));
                //凑成4组8位二进制
                for(int j=0;j<8-binaryStr.length();j++){
                    binaryStr="0"+binaryStr;
                }
                binaryMask+=binaryStr;
            }
            //比较二进制字符串中第一个0的位置和最后一个1的位置来判断掩码是否合法
            if(binaryMask.indexOf("0")<binaryMask.lastIndexOf("1")){
                isMask=false;
            }else {
                isMask=true;
            }
             
            //掩码合法后再来判断IP是否合法
            if(isMask){
                String[] strArr=ips[0].split("\\.");
                if(strArr.length==4){
                    int[] ipArr=new int[4];
                    for(int i=0;i<4;i++){
                        if(strArr[i]==""){
                            ipArr[i]=-1;
                        }else {
                            ipArr[i]=Integer.parseInt(strArr[i]);
                        }
                    }
                    if((0<=ipArr[0]&&ipArr[0]<=255) && (0<=ipArr[1]&&ipArr[1]<=255) && (0<=ipArr[2]&&ipArr[2]<=255) && (0<=ipArr[3]&&ipArr[3]<=255)){
                        if(ipArr[0]>=1 && ipArr[0]<=126){
                            isA++;
                            if(ipArr[0]==10)
                                isPrivate++;
                        }else if(ipArr[0]>=128 && ipArr[0]<=191){
                            isB++;
                            if(ipArr[0]==172 && (ipArr[1]>=16 && ipArr[1]<=31))
                                 isPrivate++;
                        }else if (ipArr[0]>=192 && ipArr[0]<=223) {
                            isC++;
                            if(ipArr[0]==192 && ipArr[1]==168)
                                 isPrivate++;
                        }else if (ipArr[0]>=224 && ipArr[0]<=239) {
                            isD++;
                        }else if (ipArr[0]>=240 && ipArr[0]<=255) {
                            isE++;
                        }
                    }else{
                        isEroor++;
                    }
                }else {
                    isEroor++;
                }
                 
            }else {
                isEroor++;
            }
        }
        System.out.println(isA+" "+isB+" "+isC+" "+isD+" "+isE+" "+isEroor+" "+isPrivate);
        sc.close();
    }
}

知识点:

  • 在这里判断ip地址是否合法就是判断其是否由四个0到255之间的数字和三个.构成
  • 在正则表达式中“.”表示任意一个字符,因此在用.来分隔字符串时要进行转义\\.
  • 私有IP地址也可以属于某一类

猜你喜欢

转载自blog.csdn.net/heyiamcoming/article/details/80403518
今日推荐