题解 | #判断两个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 in = new Scanner(System.in);
        String subnetMask = in.nextLine();
        String ip1 = in.nextLine();
        String ip2 = in.nextLine();
        System.out.println(inSubnet(subnetMask, ip1, ip2));
    }

    // 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2。
    public static int inSubnet(String subnetMask, String ip1, String ip2) {
        if (!(validateSubnetMask(subnetMask) & validateIp(ip1) & validateIp(ip2))) {
            return 1;
        }
	  	// 把三个地址都转成二进制字符串
        String subnetMaskBin = toBinaryString(subnetMask);
        String ip1Bin = toBinaryString(ip1);
        String ip2Bin = toBinaryString(ip2);
        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        for (int i = 0; i < 32; i++) {
		  	// charAt取到的0是48,1是49
            int sub = (int) subnetMaskBin.charAt(i) - 48;
            int i1 = (int) ip1Bin.charAt(i) - 48;
            int i2 = (int) ip2Bin.charAt(i) - 48;
            int and1 = sub & i1;
            int and2 = sub & i2;
            sb1.append(and1);
            sb2.append(and2);
        }
		// 看看二进制每个位上取&得出来的结果是不是一样的
        return sb1.toString().contentEquals(sb2) ? 0 : 2;
    }

    // 校验子网掩码,是返回true
    public static boolean validateSubnetMask(String subnetMask) {
        // 先转成二进制的字符串
        String binaryString = toBinaryString(subnetMask);
        // 找到第一个0的位置
        int location0 = binaryString.indexOf("0");
        String substring = binaryString.substring(location0);
	  	// 如果第一个0后面没有1了那就表示都是左边是1右边是0,同时校验一下他是不是ip范围内的
        return !substring.contains("1") & validateIp(subnetMask);
    }

    // 校验ip,是返回true
    public static boolean validateIp(String ip) {
        String[] split = ip.split("\\.");
        for (String i : split) {
            String binaryString = Integer.toBinaryString(Integer.parseInt(i));
            // 是ip的判断条件就是4个数字都小于256,换算成二进制就是其长度要小于8,最大的255为11111111
            if (binaryString.length() > 8) {
                return false;
            }
        }
        return true;
    }

    // 把ip或子网掩码转成二进制字符串
    public static String toBinaryString(String ip) {
        StringBuilder stringBuilder = new StringBuilder();
        String[] split = ip.split("\\.");
        for (String i : split) {
            String binaryString = Integer.toBinaryString(Integer.parseInt(i));
		  	// 不足8位的用0补齐
            StringBuilder complete0 = new StringBuilder();
            for (int k = 0; k < 8 - binaryString.length(); k++) {
                complete0.append("0");
            }
            stringBuilder.append(complete0).append(binaryString);
        }
        return stringBuilder.toString();
    }

}

全部评论

相关推荐

梦倩倩:同学,瞅瞅我司,医疗独角兽,校招刚开,名额有限,先到先得,****最新动态,绿灯直达,免笔试~
我的秋招日记
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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