题解 | #判断两个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);
        String mask = sc.nextLine();
        String ip1 = sc.nextLine();
        String ip2 = sc.nextLine();

        boolean isMask = Main.isCorrectNet(mask);
        boolean maskRes = Main.isMaskCode(mask);
        boolean ip1Res = Main.isCorrectNet(ip1);
        boolean ip2Res = Main.isCorrectNet(ip2);

        if (isMask&& maskRes && ip1Res && ip2Res){
            System.out.println(Main.isSameNetwork(ip1, ip2, mask));
        }else{
            System.out.println("1");
        }
    }

    /**
     * 子网掩码判断
     * @param net
     * @return
     */
    public static boolean isMaskCode(String net){
        String[] split = net.split("\\.");
        StringBuffer completedSb = new StringBuffer();
        for (String s : split) {
            long speratedIp = Long.parseLong(s);
            if (speratedIp != 0){
            String sb = Long.toBinaryString(speratedIp);
            completedSb.append(Main.autoComplete(sb.toString(), "0", 8));
            }else{
                completedSb.append("00000000");
            }
        }

        String zeroPart = completedSb.substring(completedSb.indexOf("0"));
        if (zeroPart.contains("1")){
            // 掩码格式错误
            return false;
        }else {
            return true;
        }
    }

    /**
     * ip判断
     * @param ip
     * @return
     */
    public static boolean isCorrectNet(String ip){
        String[] splitIp = ip.split("\\.");
        for (String s : splitIp) {
            if (Integer.parseInt(s)>255 || Integer.parseInt(s)<0){
                return false;
            }
        }
        return true;
    }

    /**
     * 判断是否属于同一个子网
     * @param ip1
     * @param ip2
     * @param subNet
     * @return
     */
    public static String isSameNetwork(String ip1, String ip2, String subNet){
        //子网掩码长度
        String[] split = subNet.split("\\.");
        StringBuffer sb = new StringBuffer();
        for (String s : split) {
            long speratedIp = Long.parseLong(s);
            sb.append(Long.toBinaryString(speratedIp));
        }

        int subNetIndex = sb.indexOf("0");

        //解析ip1
        String[] split1 = ip1.split("\\.");
        String ip1Sb = "";
        StringBuffer completedSb1 = new StringBuffer();

        for (String s : split1) {
            long speratedIp1 = Long.parseLong(s);
            ip1Sb = Long.toBinaryString(speratedIp1);
            completedSb1.append(Main.autoComplete(ip1Sb, "0", 8));
        }
        String subIp1 = completedSb1.substring(0, subNetIndex - 1);

        //解析ip2
        String[] split2 = ip2.split("\\.");
        String ip2Sb = "";
        StringBuffer completedSb2 = new StringBuffer();
        for (String s : split2) {
            long speratedIp2 = Long.parseLong(s);
            ip2Sb = Long.toBinaryString(speratedIp2);
            completedSb2.append(Main.autoComplete(ip2Sb, "0", 8));
        }
        String subIp2 = completedSb2.substring(0, subNetIndex - 1);

        if (subIp2.equals(subIp1)){
            return "0";
        }else {
            return "2";
        }
    }

    public static String autoComplete(String str, String symbol, int fixedLen){
        int strLen = str.length();
        int neededLen = fixedLen - strLen;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < neededLen; i++) {
            sb.append(symbol);
        }
        return sb+str;

    }
}

全部评论

相关推荐

都送什么礼物吗?如果送的话,价格大概都是多少?辛苦大家给个参考啦!
牛客73617529...:要送就送那种没必要买又很贵的,假设一个打瓦的显示屏 鼠标 键盘都很贵,你送这些突出不了价值,直接送一个很贵的鼠标垫包记住你的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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