题解 | #判断两个IP是否属于同一子网#

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

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

import java.util.Scanner;

// 此类题比较复杂,多写几个函数这样好debug,看上去也清楚一些
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
            String mask = sc.nextLine();
            String ip1 = sc.nextLine();
            String ip2 = sc.nextLine();

            if(!areLegalMaskAndIps(mask,ip1,ip2)){
                System.out.println(1);
                continue;
            }
            //记住split()是正则匹配,匹配'.'的时候要加转义符\,又因为是在“”中,还要再加一个转义符
            //来转义转义符\
            String[] maskSeqs = mask.split("\\.");
            String[] ip1Seqs = ip1.split("\\.");
            String[] ip2Seqs = ip2.split("\\.");
            int error=0;
            for(int i=0;i<4;i++){
                int num = Integer.parseInt(maskSeqs[i]);
                int num1 = Integer.parseInt(ip1Seqs[i]);
                int num2 = Integer.parseInt(ip2Seqs[i]);
                int result1 = num&num1;
                int result2 = num&num2;
                if(result1!=result2){
                    error++;
                    break;
                }
            }
            if(error==0){
                System.out.println(0);
            }
            else{
                System.out.println(2);
            }

        }
    }

    public static boolean areLegalMaskAndIps(String mask,String ip1,String ip2){
        String[] maskSeqs = mask.split("\\.");
        String[] ip1Seqs = ip1.split("\\.");
        String[] ip2Seqs = ip2.split("\\.");
        
        if(maskSeqs.length!=4||ip1Seqs.length!=4||ip2Seqs.length!=4){
            return false;
        }

        for(int i=0;i<4;i++){
            int num = Integer.parseInt(maskSeqs[i]);
            int num1 = Integer.parseInt(ip1Seqs[i]);
            int num2 = Integer.parseInt(ip2Seqs[i]);
            if(num>255||num1>255||num2>255||num<0||num1<0||num2<0){
                return false;
            }
        }
        //mask有一个特殊的地方需要判定,那就是他是左1,右0的形式,1不能出现在0之后
        //否则就是非法的,设想的算法是找到最后一个1的索引,截取之前的子串,只要其中含有‘0’,那就非法
        String maskInBinary = getBinaryString(maskSeqs);
        String subStr = maskInBinary.substring(0,maskInBinary.lastIndexOf('1')+1);//1加不加都一样
        if(subStr.contains("0")){
            return false;
        }
        return true;
    }

    public static String getBinaryString(String[] strs){
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<4;i++){
            int num = Integer.parseInt(strs[i]);           
            String s = Integer.toBinaryString(num);
            //趁没人,补个零先,不然后续计算会出错
            while(s.length()<8){
                s = '0'+s;
            }
            sb.append(s);            
        }
        return sb.toString();
    }
}

全部评论

相关推荐

在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
10-05 11:11
海南大学 Java
投票
理想江南137:感觉挺真诚的 感觉可以试一试
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务