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

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

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

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (sc.hasNext()) {
            //子网掩码
            String mask = sc.nextLine();
            //ip1
            String ip1 = sc.nextLine();
            //ip2
            String ip2 = sc.nextLine();
            int result = solution(mask, ip1, ip2);
            System.out.println(result);
        }
    }

    //判断两个ip是否属于一个子网
    public static int solution(String mask, String ip1, String ip2) {
        //如果掩码不合法,返回1
        if (maskIsInvaild(mask)) {
            return 1;
        }
        //如果ip不合法,返回1
        if (ipIsInvaild(ip1) || ipIsInvaild(ip2)) {
            return 1;
        }

        String newMask = changeTo32(mask);
        String newIp1 = changeTo32(ip1);
        String newIp2 = changeTo32(ip2);
        //记录ip1与掩码与运算的结果
        StringBuilder temp1 = new StringBuilder();
        //记录ip2与掩码与运算的结果
        StringBuilder temp2 = new StringBuilder();

        //ip1与掩码进行与运算
        for (int i = 0; i < newMask.length(); i++) {
            if (newMask.charAt(i) == '1' && newIp1.charAt(i) == '1') {
                temp1.append("1");
            } else {
                temp1.append("0");
            }
        }

        //ip2与掩码进行与运算
        for (int i = 0; i < newMask.length(); i++) {
            if (newMask.charAt(i) == '1' && newIp2.charAt(i) == '1') {
                temp2.append("1");
            } else {
                temp2.append("0");
            }
        }
        //如果相等,则为同一子网,返回0,否则返回2
        if (temp1.toString().equals(temp2.toString())) {
            return 0;
        } else {
            return 2;
        }
    }

    //判断子网掩码是否合法
    public static boolean maskIsInvaild(String mask) {
        String[] maskArr = mask.split("\\.");
        //字段不为4,非法
        if (maskArr.length != 4) {
            return true;
        }
        //不在0-255之间,非法
        for (String s : maskArr) {
            if (Integer.parseInt(s) < 0 || Integer.parseInt(s) > 255) {
                return true;
            }
        }
        //不是连续的1和0,非法
        // String newMask = toBinary(maskArr[0]) + toBinary(maskArr[1]) + toBinary(
        //                      maskArr[2]) + toBinary(maskArr[3]);
        String newMask = changeTo32(mask);
        if (!newMask.matches("[1]{1,}[0]{1,}")) {
            return true;
        }
        //默认合法
        return false;
    }

    //判断ip是否合法
    public static boolean ipIsInvaild(String ip) {
        String[] ipArr = ip.split("\\.");
        for (String s : ipArr) {
            if (Integer.parseInt(s) < 0 || Integer.parseInt(s) > 255) {
                return true;
            }
        }
        //默认合法
        return false;
    }

    //转换为8位二进制数
    public static String toBinary(String str) {
        String result = Integer.toBinaryString(Integer.parseInt(str));
        //补足8位
        while (result.length() < 8) {
            result = "0" + result;
        }
        return result;
    }

    //转换为32位进制数
    public static String changeTo32(String str) {
        String[] arr = str.split("\\.");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            String temp = Integer.toBinaryString(Integer.parseInt(arr[i]));
            //补足8位
            while (temp.length() < 8) {
                temp = "0" + temp;
            }
            sb.append(temp);
        }
        return sb.toString();
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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