题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

import java.util.ArrayList;

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别

        //输入数据
        List<String> list = new ArrayList<>();

        while(in.hasNextLine()){
            String s = in.nextLine();
            list.add(s);
        }         //接受到list中



        int[] ans = new int[7];
        for(String s : list){
            String[] ipAndMask = s.split("~");
            String[] ipAddress = ipAndMask[0].split("\\.");
            String[] mask = ipAndMask[1].split("\\.");
            int a = Integer.valueOf(ipAddress[0]) & Integer.valueOf(mask[0]);
            if(a==0 || a==127){
                continue;
            }
            if(!isWrong(s, ipAndMask, ipAddress, mask)){
                ans[5]+=1;
                continue;
            }
            if(isPrivate(s, ipAndMask, ipAddress, mask)){
                ans[6]+=1;
            }
            if(netClasses(s, ipAndMask, ipAddress, mask)!=-1){
                ans[netClasses(s, ipAndMask, ipAddress, mask)]+=1;
            }
            
        }
        for(int i=0 ; i<7 ; ++i){
            System.out.print(ans[i]+" ");
        }
    }

    public static boolean isWrong(String s, String[] ipAndMask, String[] ipAddress, String[] mask){
        StringBuilder ismask = new StringBuilder(""); //判断是否前面权威1
        if(ipAddress.length!=4 || mask.length!=4){ //不足四位
            
            return false;
        }
        if(mask[0].equals("255") && mask[1].equals("255") &&mask[2].equals("255") &&mask[3].equals("255") ) {
            return false;
        }
        for(int i=0 ; i < ipAddress.length ; ++i){
            int h1 = Integer.valueOf(ipAddress[i]);
            int h2 = Integer.valueOf(mask[i]);
            int h = h1&h2;

            if(h<0 || h>255){
                return false;
            }

            if(h2 < 0 || h2>255){
                
                return false;
            }
            
            int b = 1<<8;
            h2 = h2|b;
            ismask.append(Integer.toBinaryString(h2).substring(1));
        }
        String mask1 = ismask.toString();
        
        for(int i=1 ; i<mask1.length(); ++i){
            if(mask1.charAt(i-1) == '0' && mask1.charAt(i) == '1'){
                
                return false; //子网掩码有前0后1的情况
            }
        }
        return true;
    }

    public static boolean isPrivate(String s, String[] ipAndMask, String[] ipAddress, String[] mask){
        int[] netAddress = new int[4];
        
        for(int i=0 ; i<ipAddress.length ; ++i){
            int h1 = Integer.valueOf(ipAddress[i]);
            int h2 = Integer.valueOf(mask[i]);
            int h = h1&h2;
            netAddress[i] = h;
        }

        if(netAddress[0] == 10){
            return true;
        }
        if(netAddress[0] == 172 && netAddress[1]>=16 && netAddress[1]<=31){
            return true;
        }
        if(netAddress[0] == 192 && netAddress[1] == 168){
            return true;
        }
        return false;
    }

    public static int netClasses(String s, String[] ipAndMask, String[] ipAddress, String[] mask){
        int[] netAddress = new int[4];
        for(int i=0 ; i<ipAddress.length ; ++i){
            int h1 = Integer.valueOf(ipAddress[i]);
            int h2 = Integer.valueOf(mask[i]);
            int h = h1&h2;
            netAddress[i] = h;
            
        }
        
        if(netAddress[0] >= 1 && netAddress[0]<=126){
            return 0;
        }
        if(netAddress[0]>=128 && netAddress[0]<=191){
            return 1;
        }
        if(netAddress[0]>=192 && netAddress[0]<=223){
            return 2;
        }
        if(netAddress[0]>=224&&netAddress[0]<=239){
            return 3;
        }
        if(netAddress[0] >=240 && netAddress[0]<=255){
            return 4;
        }
        return -1;

    }

}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务