题解 | #字符串最后一个单词的长度#,一步一步来其实是比中等题容易的,刚开始还以为子网掩码只有0和255

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

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

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String subnetMask = in.nextLine();
            String ip1 = in.nextLine();
            String ip2 = in.nextLine();
            // 判断是否合法
            char c = isError(subnetMask, ip1, ip2);
            switch (c){
                case '1':
                    System.out.println("1");
                    break;
                case '2':
                    System.out.println("2");
                    break;
                case '0':
                    System.out.println("0");
            }

        }
    }

    public static char isError(String subnetMask, String ip1, String ip2) {
        String[] split1 = subnetMask.split("\\.");
        String[] split2 = ip1.split("\\.");
        String[] split3 = ip2.split("\\.");
        int length1 = split1.length;
        int length2 = split2.length;
        int length3 = split3.length;
        if (length1 != 4 || length2 != 4 || length3 != 4) {
            return '1';
        }
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < length1; i++) {
            String s = split1[i];
            // 确保都是数字组成
            for (int j = 0; j < s.length(); j++) {
                if (s.charAt(j) < '0' || s.charAt(j) > '9'){
                    return '1';
                }
            }
            // 判断范围
            int parseInt = Integer.parseInt(s);
            if (parseInt < 0 ||parseInt > 255){
                return '1';
            }
            String binaryString = Integer.toBinaryString(parseInt);
            int length = binaryString.length();
            if (length < 4){
                for (int j = 0; j < 4 - length; j++) {
                    builder.append("0");
                }
            }
            builder.append(binaryString);
        }
        // 是否都包含0和1
        boolean b1 = builder.toString().contains("0");
        boolean b2 = builder.toString().contains("1");
        if (!b1 || !b2) {
            return '1';
        }

        // 最后一次出现1的索引比第一次出现0的索引大
        if (builder.lastIndexOf("1") > builder.indexOf("0")) {
            return '1';
        }

        boolean isErrorIp1 = isErrorIp(split2);
        boolean isErrorIp2 = isErrorIp(split3);
        if (isErrorIp1 || isErrorIp2) {
            return '1';
        }
        boolean b = isEqual(split1, split2, split3);
        if (!b) {
            return '2';
        }
        return '0';
    }

    private static boolean isEqual(String[] split1, String[] split2, String[] split3) {
        StringBuffer buffer1 = new StringBuffer();
        StringBuffer buffer2 = new StringBuffer();
        StringBuffer buffer3 = new StringBuffer();
        for (int i = 0; i < 4; i++) {
            String s1 = split1[i];
            String s2 = split2[i];
            String s3 = split3[i];
            int parseInt1 = Integer.parseInt(s1);
            int parseInt2 = Integer.parseInt(s2);
            int parseInt3 = Integer.parseInt(s3);
            String binaryString1 = Integer.toBinaryString(parseInt1);
            int length1 = binaryString1.length();
            if (length1 < 8){
                for (int j = 0; j < 8 - length1; j++) {
                    buffer1.append("0");
                }
            }
            String binaryString2 = Integer.toBinaryString(parseInt2);
            int length2 = binaryString2.length();
            if (length2 < 8){
                for (int j = 0; j < 8 - length2; j++) {
                    buffer2.append("0");
                }
            }
            String binaryString3 = Integer.toBinaryString(parseInt3);
            int length3 = binaryString3.length();
            if (length3 < 8){
                for (int j = 0; j < 8 - length3; j++) {
                    buffer3.append("0");
                }
            }
            buffer1.append(binaryString1);
            buffer2.append(binaryString2);
            buffer3.append(binaryString3);
        }
        char[] chars1 = buffer1.toString().toCharArray();
        char[] chars2 = buffer2.toString().toCharArray();
        char[] chars3 = buffer3.toString().toCharArray();
        StringBuilder result1 = new StringBuilder();
        StringBuilder result2 = new StringBuilder();
        for (int i = 0; i < 32; i++) {
            if (chars1[i] == '1' && chars2[i] == '1'){
                result1.append("1");
            }else {
                result1.append("0");
            }
            if (chars1[i] == '1' && chars3[i] == '1'){
                result2.append("1");
                continue;
            }
            result2.append("0");
        }
        if (!result1.toString().equals(result2.toString())){
            return false;
        }
        return true;
    }

    public static boolean isErrorIp(String[] str) {
        for (int i = 0; i < str.length; i++) {
            String s = str[i];
            char[] chars = s.toCharArray();
            for (int j = 0; j < chars.length; j++) {
                if (chars[j] < '0' || chars[j] > '9') {
                    return true;
                }
            }
            int parseInt = Integer.parseInt(s);
            if (parseInt < 0 || parseInt > 255) {
                return true;
            }
        }
        return false;
    }
}

全部评论

相关推荐

06-07 00:00
已编辑
腾讯_后端开发
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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