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

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

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

import java.util.Scanner;
import java.util.regex.Pattern;

// 注意类名必须为 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 mastStr = in.next();
            String ip1 = in.next();
            String ip2 = in.next();

            if (!chekIp(ip1) || !chekIp(ip2)) { // ip不合法
                System.out.println(1);
                continue;
            }
            if (!chekMast(mastStr)) { // 子网掩码非法
                System.out.println(1);
                continue;
            }
            //判断是否属于同一子网络
            if (chekEqual(ip1, ip2, mastStr)) {
                System.out.println(0);
            } else {
                System.out.println(2);
            }


        }
    }
    // 校验ip
    private static boolean chekIp(String ip) {

        // ip的每一段都在 0 -255 之间
        String[] ipArr = ip.split("\\.");
        if (ipArr.length != 4) {
            return false;
        }
        Pattern p = Pattern.compile("[0-9]");
        for (int i = 0; i < ipArr.length ; i++) {

            if (p.matcher(ipArr[i]).find()) { // 校验位数字
                Integer d = Integer.valueOf(ipArr[i]);
                if (d > 255 || d < 0) {
                    return false;
                }
            } else {
                return false;
            }

        }

        return true;
    }

    // 校验子网掩码
    private static boolean chekMast(String mast) {

        String[] mastArr = mast.split("\\.");

        if (mastArr.length != 4) {
            return false;
        }
        StringBuilder sb = new StringBuilder();
        Pattern p = Pattern.compile("[0-9]");
        for (int i = 0; i < mastArr.length ; i++) {
            if (p.matcher(mastArr[i]).find()) { // 校验位数字
                 Integer d = Integer.valueOf(mastArr[i]);
                if(d > 255 || d < 0){
                    return false; 
                }
                sb.append(getBinaryString(mastArr[i]));
            } else {
                return false;
            }
        }
        return sb.toString().contains("1") && sb.toString().contains("0") &&
               !sb.toString().contains("01");
    }
    private static String getBinaryString(String str) {

        String bin =  Integer.toBinaryString(Integer.valueOf(str));
        while ( bin.length() < 8) {
            bin = "0".concat(bin);
        }
        return bin;
    }

    private static boolean chekEqual(String ip1, String ip2, String mast) {


        String[] ipArr1 = ip1.split("\\.");
        String[] ipArr2 = ip2.split("\\.");
        String[] mastArr = mast.split("\\.");
        StringBuilder ip1Sb = new StringBuilder();
        StringBuilder ip2Sb = new StringBuilder();
        StringBuilder mastSb = new StringBuilder();
        for (int i = 0; i < ipArr1.length ; i++) {
            ip1Sb.append( getBinaryString(ipArr1[i]) );
            ip2Sb.append( getBinaryString(ipArr2[i]) );
            mastSb.append( getBinaryString(mastArr[i]) );
        }
        StringBuilder ip1Result = new StringBuilder();
        StringBuilder ip2Result = new StringBuilder();

        char[] ip1char = ip1Sb.toString().toCharArray();
        char[] ip2char = ip2Sb.toString().toCharArray();
        char[] mastchar = mastSb.toString().toCharArray();
        for (int i = 0; i < ipArr1.length ; i++) {

            if (ip1char[i] == '1' && mastchar[i] == '1' ) {
                ip1Result.append('1');
            } else {
                ip1Result.append('0');
            }
            if (ip2char[i] == '1' && mastchar[i] == '1' ) {
                ip2Result.append('1');
            } else {
                ip2Result.append('0');
            }
        }

        if (ip1Result.toString().equals(ip2Result.toString())) {
            return true;
        } else {
            return false;
        }


    }
}

全部评论

相关推荐

10-30 19:23
已编辑
山东大学(威海) C++
牛至超人:其实简历是不需要事无巨细的写的,让对方知道你有这段经历就行了,最重要的是面试的时候讲细讲明白
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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