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

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

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

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    /**
     * 描述
     * IP地址是由4个0-255之间的整数构成的,用"."符号相连。
     * 二进制的IP地址格式有32位,例如:10000011,01101011,00000011,00011000;每八位用十进制表示就是131.107.3.24
     * 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
     * 子网掩码与IP地址结构相同,是32位二进制数,由1和0组成,且1和0分别连续,其中网络号部分全为“1”和主机号部分全为“0”。
     * 你可以简单的认为子网掩码是一串连续的1和一串连续的0拼接而成的32位二进制数,左边部分都是1,右边部分都是0。
     * 利用子网掩码可以判断两台主机是否在同一子网中。
     * 若两台主机的IP地址分别与它们的子网掩码进行逻辑“与”运算(按位与/AND)后的结果相同,则说明这两台主机在同一子网中。
     * 示例:
     * I P 地址  192.168.0.1
     * 子网掩码  255.255.255.0
     * 转化为二进制进行运算:
     * I P 地址   11000000.10101000.00000000.00000001
     * 子网掩码 11111111.11111111.11111111.00000000
     * AND运算   11000000.10101000.00000000.00000000
     * 转化为十进制后为:
     * 192.168.0.0
     * I P 地址  192.168.0.254
     * 子网掩码  255.255.255.0
     * 转化为二进制进行运算:
     * I P 地址 11000000.10101000.00000000.11111110
     * 子网掩码  11111111.11111111.11111111.00000000
     * AND运算  11000000.10101000.00000000.00000000
     * 转化为十进制后为:
     * 192.168.0.0
     * 通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
     * 输入一个子网掩码以及两个ip地址,判断这两个ip地址是否是一个子网络。
     * 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2。
     * 注:
     * 有效掩码与IP的性质为:
     * 1. 掩码与IP每一段在 0 - 255 之间
     * 2. 掩码的二进制字符串前缀为网络号,都由‘1’组成;后缀为主机号,都由'0'组成
     * <p>
     * 输入描述:
     * 3行输入,第1行是输入子网掩码、第2,3行是输入两个ip地址
     * 题目的示例中给出了三组数据,但是在实际提交时,你的程序可以只处理一组数据(3行)。
     * 输出描述:
     * 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2
     * 255.255.255.0
     * 192.168.224.256
     * 192.168.10.4
     * 1
     * --
     * 255.0.0.0
     * 193.194.202.15
     * 232.43.7.59
     * 2
     * --
     * 255.255.255.0
     * 192.168.0.254
     * 192.168.0.1
     * 0
     *
     * @param args
     */

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String mask = in.nextLine();
            String ip1 = in.nextLine();
            String ip2 = in.nextLine();
            int[] maskArray = str2IntArr(mask);
            int[] ipArray1 = str2IntArr(ip1);
            int[] ipArray2 = str2IntArr(ip2);
            if (null == maskArray || null == ipArray1 || null == ipArray2
                    || maskArray[0] < 255 ||maskArray[3] != 0) {//子掩码不能为0.0.0.0至少首位是255
                System.out.println("1");
            } else {
                StringBuilder sb1 = new StringBuilder();
                StringBuilder sb2 = new StringBuilder();
                for (int i = 0; i < 4; i++) {
                    int c = maskArray[i];
                    int p1 = ipArray1[i];
                    int p2 = ipArray2[i];
                    ipArray1[i] = c & p1;
                    ipArray2[i] = c & p2;
                    sb1.append(ipArray1[i]).append(SPLIT);
                    sb2.append(ipArray2[i]).append(SPLIT);
                }
                if (sb1.toString().equals(sb2.toString())) {
                    System.out.println("0");
                } else System.out.println("2");
            }
        }
    }
    final static String SPLIT = "\\.";

    public static int[] str2IntArr(String str) {
        String replace = str.replaceAll(SPLIT, "");
        for (int i = 0; i < replace.length(); i++) {
            if (!Character.isDigit(replace.charAt(i))) {
                return null;
            }
        }
        String[] arr = str.split(SPLIT);
        if (arr.length != 4) {
            return null;
        }
        int[] arrInt = new int[4];
        for (int i = 0; i < arr.length; i++) {
            String s = arr[i];
            if (s.length() > 3) {
                return null;
            }
            int num = Integer.parseInt(s);
            if (num > 255) {
                return null;
            }
            arrInt[i] = num;
        }
        return arrInt;
    }
}

全部评论

相关推荐

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