题解 | Java版 又臭又长的题解(性能还低)

判断两个IP是否属于同一子网

http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218

import java.util.*;

public class Main{
    private static int[] help = new int[]{0,1,2};
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNextLine()){
            //防止没有输入三个数
            String maskIP = in.nextLine();
            if(maskIP.length() == 0) break;
            String ip01 = in.nextLine();
            if(ip01.length() == 0) break;
            String ip02 = in.nextLine();
            if(ip02.length() == 0) break;
            //判断子网掩码是否合法
            boolean maskFlag = judgeMaskIP(maskIP);
            if(!maskFlag){
                System.out.println(help[1]);
                continue;
            }

            boolean ip01Flag = judgeIpLegal(ip01);
            if(!ip01Flag){
                System.out.println(help[1]);
                continue;
            }

            boolean ip02Flag = judgeIpLegal(ip02);
            if(!ip02Flag){
                System.out.println(help[1]);
                continue;
            }

            //判断是不是在一个网段
            long maskTest = stringToNum(maskIP);
            long ip01Test = stringToNum(ip01);
            long ip02Test = stringToNum(ip02);
            if((maskTest & ip01Test) == (maskTest & ip02Test)){
                System.out.println(help[0]);
            }else{
                System.out.println(help[2]);
            }
        }
    }
    //判断ip是否合法
    public static boolean judgeIpLegal(String ip){
       boolean flag = true;
       String[] ipTemp = ip.split("\\.");
       if(ipTemp.length != 4) {
           flag = false;
           return flag;
       } 
       for(int i = 0; i < ipTemp.length; i++){
           long tempNum = Long.parseLong(ipTemp[i]);
           if(!(tempNum >= 0 && tempNum <= 255)){
               flag = false;
               return flag;
           }
       }
       return flag;
    }
    //判断子网掩码是否合法  【0.0.0.0】和【255.255.255.255】也不算
    //掩码中间的1中如果插入了0页不是子网掩码, eg  【255.234.255.0】
    public static boolean judgeMaskIP(String maskIP){
        String[] maskString = maskIP.split("\\."); 
        if(maskString.length != 4) return false;
        long maskTemp = arraysToNum(maskString);
        if(maskTemp <= 0 || maskTemp >=0XFFFFFFFFL || (((maskTemp ^ 0XFFFFFFFFL) + 1) | maskTemp)!= maskTemp){
            return false;
        }
        return true;
    }
    //数组转Long
    public static Long arraysToNum(String[] str){        
        long resultNum = 0L;
        for(int i = 0; i < str.length; i++){
            resultNum = (resultNum << 8) + Long.parseLong(str[i]);
        }
        return resultNum;
    }
    //String转Long
    public static Long stringToNum(String strIP){
        String[] tempString = strIP.split("\\.");
        long resultNum = arraysToNum(tempString);
        return resultNum;
    }

}
全部评论

相关推荐

牛客583549203号:腾讯还好,况且实习而已,实习生流动性很大,属于正常现象,记得和HR委婉解释
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务