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

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

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

import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        int e = 0;
        int err = 0;
        int pri = 0;
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            String[] strArr = str.split("~");
            String ip = strArr[0];
            String mask = strArr[1];
            boolean isIp = isIp(ip);
            boolean isMask = isMask(mask);
            
            if(isIgnore(ip)){
                continue;
            }
            
            if(!isIp || !isMask){
                err++;
            }
            
            if(isIp && isMask){
                boolean isPri = isPrivate(ip);
                if(isPri){
                    pri++;
                }
                if(isA(ip)){
                    a++;
                }
                if(isB(ip)){
                    b++;
                }
                if(isC(ip)){
                    c++;
                }
                if(isD(ip)){
                    d++;
                }
                if(isE(ip)){
                    e++;
                }
            }
        }
        System.out.println(String.format("%d %d %d %d %d %d %d", a,b,c,d,e,err,pri));
    }
    
    private static void print(int num){
        for (int i = 31; i >= 0; i--) {
                System.out.print((num & (1 << i)) == 0? "0" : "1");
        }
        System.out.println();
    }
    
    private static int ipToInt(String str){
        String[] strArr = str.split("\\.");
        int res = 0;
        for(String item: strArr){
            res <<= 8;
            res = res + Integer.parseInt(item);
            
        }
        return res;
    }
    
    private static int stoi(String str){
        return Integer.parseInt(str);
    }
    
    private static boolean isIgnore(String str){
        String[] strArr = str.split("\\.");
        if("0".equals(strArr[0]) || "127".equals(strArr[0])){
            return true;
        }
        return false;
    }
    
    private static boolean isInt(String str){
        try{
            Integer.parseInt(str);
            return true;
        }catch(Exception e){
            return false;
        }
    }
    
    private static boolean isIp(String str){
        
        String[] strArr = str.split("\\.");
        
        if(strArr.length != 4){
            return false;
        }
        for(String item: strArr){
            if(item.isEmpty() || !isInt(item) || stoi(item)>255){
                return false;
            }
        }
        
        return true;
    }
    
    private static boolean isMask(String str){
        int b = 0;
        String[] strArr = str.split("\\.");
        for(String item: strArr){
            b = (b<<8) | stoi(item);
        }
        
        if(b == 0 || ~b == 0){
            return false;
        }
        
        if((b|(~b+1)) != b){
            return false;
        }
        
        return true;
    }
    
    private static boolean isPrivate(String str){
        return isInRange(str, "10.0.0.0", "10.255.255.255") || 
           isInRange(str, "172.16.0.0", "172.31.255.255") || 
           isInRange(str, "192.168.0.0", "192.168.255.255");
    }
    
    private static boolean isA(String str){
        return isInRange(str, "1.0.0.0", "126.255.255.255");
    }
    
    private static boolean isB(String str){
        return isInRange(str, "128.0.0.0", "191.255.255.255");
    }
    
    private static boolean isC(String str){
        return isInRange(str, "192.0.0.0", "223.255.255.255");
    }
    
    private static boolean isD(String str){
        return isInRange(str, "224.0.0.0", "239.255.255.255");
    }
    
    private static boolean isE(String str){
        return isInRange(str, "240.0.0.0", "255.255.255.255");
    }
    
    private static boolean isInRange(String a, String s, String e){
        int intA = ipToInt(a);
        int intS = ipToInt(s);
        int intE = ipToInt(e);
        return intA >= intS && intA <= intE;
    }
} 

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务