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

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

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder ans = new StringBuilder();
        String co, ip1, ip2;
        int[] inAr1 = new int[] {-1, -1, -1, -1}, inAr2 = new int[] {-1, -1, -1, -1},
        inAr3 = new int[] {-1, -1, -1, -1};
        int i = 0, cover, ipIn1, ipIn2;
        boolean isNoLegal;
        int[] legCor = new int[31];
        do {//获得所有合法的掩码
            legCor[i] = -1 << i + 1;
            i++;
        } while (i < 31);
        try {
            while ((co = r.readLine()) != null && !co.isEmpty()) {
                ip1 = r.readLine();
                ip2 = r.readLine();
                getAds(co, inAr1);
                getAds(ip1, inAr2);
                getAds(ip2, inAr3);
                i = 0;
                isNoLegal = false;
                do {
                    if ((inAr1[i] | 255 - inAr1[i]) < 0 || (inAr2[i] | 255 - inAr2[i]) < 0 ||
                            (inAr3[i] | 255 - inAr3[i]) < 0) {
                        isNoLegal = true;
                        break;
                    }
                    i++;
                } while (i < 4);
                if (isNoLegal) {//地址非法输出1
                    ans.append(1).append("\n");
                    continue;
                }
                i = 0;
                cover = 0;//初值为0
                ipIn1 = 0;//初值为0
                ipIn2 = 0;//初值为0
                do {
                    cover = cover | inAr1[i] << (3 - i) * 8;//掩码合并
                    ipIn1 = ipIn1 | inAr2[i] << (3 - i) * 8;//第一行ip合并
                    ipIn2 = ipIn2 | inAr3[i] << (3 - i) * 8;//第二行ip合并
                    i++;
                } while (i < 4);
                i = 0;
                isNoLegal = true;//默认不在
                do {//看输入的掩码是否在合理掩码数组内
                    if (legCor[i] == cover) {
                        isNoLegal = false;
                        break;
                    }
                    i++;
                } while (i < 31);
                if (isNoLegal) {//子网掩码地址非法输出1
                    ans.append(1).append("\n");
                    continue;
                }
                if ((cover & ipIn1) == (cover & ipIn2)) ans.append(0).append("\n");
                else ans.append(2).append("\n");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.print(ans);
    }

    public static void getAds(String str, int[] arr) {
        char[] chs = str.toCharArray();
        int z = 0, x = 0, c = 0, n = 0, l = chs.length;
        do {
            if (chs[z] == '.') {
                if (x == 0) c++;//空位不变为-1
                else arr[c++] = n;//非空将值赋给数组返回
                n = 0;
                x = 0;
                z++;
                continue;
            }
            x++;
            n *= 10;
            n += chs[z] - '0';
            if (c == 3) arr[3] = n;
            z++;
        } while (z < l);
    }
}

全部评论

相关推荐

04-30 15:51
已编辑
上海交通大学 机械工程师
点赞 评论 收藏
分享
抱抱碍事梨a:三点建议,第一点是建议再做一个项目,把自我介绍部分顶了,第二点是中南大学加黑加粗,第三点是建议加v详细交流
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务