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

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

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

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String mask = in.next();
            String ip1 = in.next();
            String ip2 = in.next();
            //判断掩码
            boolean checkMask = maskCheck(mask);
            //检查ip
            boolean checkIp1 = ipCheck(ip1);
            boolean checkIp2 = ipCheck(ip2);
            boolean checkResult = checkIp1 && checkIp2 && checkMask;
            if (checkResult) {
                //转二进制
                String mb = toBinary(mask);
                String b1 = toBinary(ip1);
                String b2 = toBinary(ip2);
                //ip和掩码与运算
                int same = 0;
                for (int i = 0; i < 32; i++) {
                    char m = mb.charAt(i);
                    char c1 = b1.charAt(i);
                    char c2 = b2.charAt(i);
                    char compute1 = 'a';
                    char compute2 = 'a';
                    if (m == '1' && c1 == '1') {
                        compute1 = '1';
                    } else {
                        compute1 = '0';
                    }
                    if (m == '1' && c2 == '1') {
                        compute2 = '1';
                    } else {
                        compute2 = '0';
                    }
                    //是否同一子网判断
                    if (compute1 != compute2) {
                        same++;
                        break;
                    }
                }
                if (same == 0) {
                    System.out.println(0);
                } else {
                    System.out.println(2);
                }
            } else {
                System.out.println(1);
            }
        }
    }
    public static boolean maskCheck(String mask) {
        String[] facs = mask.split("\\.");
        if (facs.length != 4) {
            return false;
        } else {
            //检查值的范围
            String binaryIp = "";
            for (int i = 0; i < 4; i++) {
                String temp = facs[i];
                int value = Integer.parseInt(temp);
                if (value < 0 || value > 255) {
                    return false;
                } else {
                    //转二进制
                    String b = Integer.toBinaryString(value);
                    if (b.length() < 8) {
                        for (int j = 0; j < 8 - b.length(); j++) {
                            b = "0" + b;
                        }
                    }
                    binaryIp += b;
                }
            }
            //检查掩码的0和1位置
            int start = 0;
            for (int i = 0; i < binaryIp.length(); i++) {
                //找到第一个不是1的位置
                if (binaryIp.charAt(i) != '1' && start == 0) {
                    start = i - 1;
                }
            }
            for (int i = 0; i <= start; i++) {
                if (binaryIp.charAt(i) != '1') {
                    return false;
                }
            }
            for (int i = start + 1; i < binaryIp.length(); i++) {
                if (binaryIp.charAt(i) != '0') {
                    return false;
                }
            }
        }
        return true;
    }
    public static boolean ipCheck(String ip) {
        //长度检查
        String[] facs = ip.split("\\.");
        if (facs.length != 4) {
            return false;
        } else {
            //检查值的范围
            for (int i = 0; i < 4; i++) {
                String temp = facs[i];
                int value = Integer.parseInt(temp);
                if (value < 0 || value > 255) {
                    return false;
                }
            }
        }
        return true;
    }
    public static String toBinary(String str) {
        //长度检查
        String binaryIp = "";
        String[] facs = str.split("\\.");
        for (int i = 0; i < 4; i++) {
            String temp = facs[i];
            int value = Integer.parseInt(temp);
            //转二进制
            String b = Integer.toBinaryString(value);
            //不足8位补0
            int length=b.length();
            if (length< 8) {
                for (int j = 0; j < 8 - length; j++) {
                    b = "0" + b;
                }
            }
            binaryIp += b;
        }
        return binaryIp;
    }
}

耗时约55min。。。。。。

全部评论

相关推荐

醉蟀:你不干有的是人干
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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