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

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

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

都转为32位的二进制后,如果子网掩码的1有n位,那么ip1和ip2的前n位必须相同,他们才是统一子网。

import java.util.Scanner;

// 注意类名必须为 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 mar = in.next();
            String ip1 = in.next();
            String ip2 = in.next();
            if (!(isMark(mar) && isIp(ip1) && isIp(ip2))) {
                System.out.println(1);
                continue;
            }
            String sMark = ipToString(mar);
            // 找到0的位置,这个位置之前的二进制必须相同才属于同一网络
            int index = sMark.indexOf("0");
            String sIp1 = ipToString(ip1);
            String sIp2 = ipToString(ip2);
            if(sIp1.substring(0,index).equals(sIp2.substring(0,index))){
                System.out.println(0);
            }else{
                System.out.println(2);
            }
        }
    }
    // 将ip地址转为32位二进制
    public static String ipToString(String ip) {
        String[] arr = ip.split("\\.");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            // 将子网掩码转为二进制字符串
            String s = Integer.toString(Integer.parseInt(arr[i]), 2);
            if (s.length() < 8) {
                for (int j = 0; j + s.length() < 8; j++) {
                    sb.append("0");
                }
            }
            sb.append(s);
        }
        return sb.toString();
    }

    public static boolean isMark(String mar) {
        if (!isIp(mar)) {
            return false;
        }
        String[] arr = mar.split("\\.");
        if (arr.length != 4) {
            return false;
        } else {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 4; i++) {
                try {
                    // 将子网掩码转为二进制字符串
                    String s = Integer.toString(Integer.parseInt(arr[i]), 2);
                    if (s.length() < 8) {
                        for (int j = 0; j + s.length() < 8; j++) {
                            sb.append("0");
                        }
                    }
                    sb.append(s);
                } catch (Exception e) {
                    return false;
                }
            }
            // 如果第一个0的位置在最后一个1的前面
            if (sb.indexOf("0") < sb.lastIndexOf("1")) {
                return false;
            }
        }
        return true;
    }

    public static boolean isIp(String ip) {
        String[] arr = ip.split("\\.");
        if (arr.length != 4) {
            return false;
        } else {
            for (int i = 0; i < 4; i++) {
                try {
                    if (Integer.parseInt(arr[i]) < 0 || Integer.parseInt(arr[i]) > 255) {
                        return false;
                    }
                } catch (Exception e) {
                    return false;
                }
            }
        }
        return true;
    }
}

全部评论

相关推荐

09-08 17:17
同济大学 Java
狗不理fe:里面的人劝一句,别来虾,我们部门24校招生淘汰率30%,还有一些人说有一年保护期,不可能!!!
我的秋招日记
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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