首页 > 试题广场 >

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

[编程题]判断两个IP是否属于同一子网
  • 热度指数:151590 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
IP地址是由4个0-255之间的整数构成的,用"."符号相连。
二进制的IP地址格式有32位,例如:10000011,01101011,00000011,00011000;每八位用十进制表示就是131.107.3.24
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,由1和0组成,且1和0分别连续,其中网络号部分全为“1”和主机号部分全为“0”。
你可以简单的认为子网掩码是一串连续的1和一串连续的0拼接而成的32位二进制数,左边部分都是1,右边部分都是0。
利用子网掩码可以判断两台主机是否在同一子网中。
若两台主机的IP地址分别与它们的子网掩码进行逻辑“与”运算(按位与/AND)后的结果相同,则说明这两台主机在同一子网中。


示例:
I P 地址  192.168.0.1
子网掩码  255.255.255.0

转化为二进制进行运算:

I P 地址   11000000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000

AND运算   11000000.10101000.00000000.00000000

转化为十进制后为:
192.168.0.0


I P 地址  192.168.0.254
子网掩码  255.255.255.0


转化为二进制进行运算:

I P 地址 11000000.10101000.00000000.11111110
子网掩码  11111111.11111111.11111111.00000000

AND运算  11000000.10101000.00000000.00000000

转化为十进制后为:
192.168.0.0

通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。

输入一个子网掩码以及两个ip地址,判断这两个ip地址是否是一个子网络。
若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2。

注:
有效掩码与IP的性质为:
1. 掩码与IP每一段在 0 - 255 之间
2. 掩码的二进制字符串前缀为网络号,都由‘1’组成;后缀为主机号,都由'0'组成



输入描述:

3行输入,第1行是输入子网掩码、第2,3行是输入两个ip地址
题目的示例中给出了三组数据,但是在实际提交时,你的程序可以只处理一组数据(3行)。



输出描述:

若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2

示例1

输入

255.255.255.0
192.168.224.256
192.168.10.4
255.0.0.0
193.194.202.15
232.43.7.59
255.255.255.0
192.168.0.254
192.168.0.1

输出

1
2
0

说明

对于第一个例子:
255.255.255.0
192.168.224.256
192.168.10.4
其中IP:192.168.224.256不合法,输出1

对于第二个例子:
255.0.0.0
193.194.202.15
232.43.7.59
2个与运算之后,不在同一个子网,输出2

对于第三个例子,2个与运算之后,如题目描述所示,在同一个子网,输出0
          
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()) {
            //子网掩码
            String yanMa = scanner.nextLine();
            //第一个ip
            String ip1 = scanner.nextLine();
            //第二个ip
            String ip2 = scanner.nextLine();
            //分别放入对应的数组中
            String[] yanMaArr = yanMa.split("[.]");
            String[] ip1Arr = ip1.split("[.]");
            String[] ip2Arr = ip2.split("[.]");
            if (!Ym(yanMaArr) || !ip(ip1Arr) || !ip(ip2Arr)) {
                System.out.println(1);
            } else {
                //把yanMa,ip1和ip2分别转成二进制
                //yanMa
                String yanMaEr = toBinary(yanMaArr);
                //ip1
                String ip1Er = toBinary(ip1Arr);
                //ip2
                String ip2Er = toBinary(ip2Arr);
                //分别与掩码做逻辑与运算
                long new1 = Long.parseLong(yanMaEr,2) & Long.parseLong(ip1Er,2);
                long new2 = Long.parseLong(yanMaEr,2) & Long.parseLong(ip2Er,2);
                if (new1 == new2) {
                    System.out.println(0);
                } else {
                    System.out.println(2);
                }
            }
        }
    }

    //判断掩码和ip是否合法
    public static boolean Ym(String[] x) {
        for (int i = 0; i < x.length; i++) {
            if (Integer.valueOf(x[i]) > 255 || Integer.valueOf(x[i]) < 0) {
                return false;
            }
        }
        //二进制字符串
        String ymEr = toBinary(x);;
        //第一个零的索引
        int index = ymEr.indexOf('0');
        if (ymEr.substring(index).contains("1")) {
            return false;
        }
        return true;
    }
    //判断ip是否合法
    public static boolean ip(String[] x) {
        for (int i = 0; i < x.length; i++) {
            if (Integer.valueOf(x[i]) > 255 || Integer.valueOf(x[i]) < 0) {
                return false;
            }
        }
        return true;
    }
    //ip转为二进制
    public static String toBinary(String[] ip) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < ip.length; i++) {
            String er1 = Integer.toBinaryString(Integer.valueOf(ip[i]));
            //不足8位,用零在前面补齐
            if (er1.length() < 8) {
                //计算0的个数
                StringBuilder sb3 = new StringBuilder();
                for (int j = 0; j < 8 - er1.length(); j++) {
                    sb3.append("0");
                }
                sb.append(sb3);
            }
            sb.append(er1);
        }
        String iPer = sb.toString();
        return iPer;
    }
}
发表于 2024-03-06 23:18:30 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int status = 1;
        List<String> lines = new ArrayList<>();
        while (in.hasNextLine()) { // 注意 while 处理多个 case

            String line = in.nextLine();
            lines.add(line);
            if (status == 3) {
                res(lines);
                status = 1;
                lines = new ArrayList<>();
                //计算
            } else {
                status++;
            }

        }
    }

    public static void res(List<String> lines) {
        long z = ipToLong(lines.get(0));
        long ip1 = ipToLong(lines.get(1));
        long ip2 = ipToLong(lines.get(2));

        if (-1L == z || -1L == ip1 || -1L == ip2 || !check(z)) {
            System.out.println(1);
        } else if ((z & ip1) == (z & ip2)) {
            System.out.println(0);

        } else {
            System.out.println(2);

        }
    }

    public static boolean check(long ip) {
        String checkz = Long.toBinaryString(ip);
        while (checkz.length() < 32) {
            checkz = "0" + checkz;
        }
        if (checkz.contains("0") && checkz.contains("1") && !checkz.contains("01")) {
            return true;
        }
        return false;
    }

    public static long ipToLong(String ip) {
        String[] ips = ip.split("\\.");
        if (ips.length != 4) {
            return -1L;
        }
        long res = 0L;
        for (int i = 0; i < 4; i++) {
            long item = Long.parseLong(ips[i]);
            if (item < 0L || item > 255L) {
                return -1L;
            }
            res += item << 8 * (3 - i);
        }
        return res;
    }

}
编辑于 2024-01-22 10:31:20 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) {// 注意 while 处理多个 case
            String mask = in.nextLine();
            String ip1 = in.nextLine();
            String ip2 = in.nextLine();
            List<Integer> list = binaryConvert(mask);
            List<Integer> list1 = binaryConvert(ip1);
            List<Integer> list2 = binaryConvert(ip2);
            if (list == null || list1 == null || list2 == null) {
                continue;
            }
            StringBuilder stringIp1 = new StringBuilder();
            StringBuilder stringIp2 = new StringBuilder();
            String maskBinary = "";
            for (int i = 0; i < list.size(); i++) {
                stringIp1.append(list1.get(i) & list.get(i));
                stringIp2.append(list2.get(i) & list.get(i));
                String binaryString = Integer.toBinaryString(Integer.valueOf(list.get(i)));
                while (binaryString.length() < 8) {
                    binaryString = "0" + binaryString;
                }
                maskBinary += binaryString;
            }
            /*  254.255.0.0
                85.122.52.249
                10.57.28.117  该用例没通过 由于子网掩码是一个32位的二进制数,其中网络部分对应为连续的1,主机部分对应为连续的0*/
            //子网掩码有效性判断
            if (maskBinary.indexOf("0") - maskBinary.lastIndexOf("1") != 1) {
                System.out.println(1);
                continue;
            }
            if (stringIp1.toString().equals(stringIp2.toString())) {
                System.out.println(0);
            } else {
                System.out.println(2);
            }
        }
    }
    private static List<Integer> binaryConvert(String mask) {
        String[] split = mask.split("\\.");
        if (split.length != 4) {
            System.out.println(1);
            return null;
        }
        List<Integer> list = new ArrayList<>();
        for (String s : split) {
            Integer num = Integer.valueOf(s);
            if (num < 0 || num > 255) {
                System.out.println(1);
                return null;
            }
            list.add(num);
        }
        return list;
    }
}

发表于 2024-01-05 17:32:41 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String [] s1 = in.nextLine().split("\\.");
        String [] s2 = in.nextLine().split("\\.");
        String [] s3 = in.nextLine().split("\\.");
        if( s1.length != 4 || s2.length != 4 || s3.length != 4) {
            System.out.println(1); return;
        }
        int [] n1 = new int[4];
        int [] n2 = new int[4];
        int [] n3 = new int[4];
        for(int i = 0; i < 4; i++){
            n1[i] = Integer.parseInt(s1[i]);
            n2[i] = Integer.parseInt(s2[i]);
            n3[i] = Integer.parseInt(s3[i]);
            if((n1[i] < 0 || n1[i] >255) || (n2[i] < 0 || n2[i] >255) || (n3[i] < 0 || n3[i] >255)){
                System.out.println(1); return;
            }
        }
        //判断子网掩码是否有效
        StringBuilder mask = new StringBuilder();
        for(int i = 0; i < 4; i++){
            String b = Integer.toBinaryString(n1[i]);
            mask.append("0000000".substring(b.length() - 1)+b);
        }
        if(mask.lastIndexOf("1") > mask.indexOf("0")){
            System.out.println(1); return;
        }
        //判断是否属于同一子网
        for(int i = 0; i < 4; i++){
            if((n1[i] & n2[i]) != (n1[i] & n3[i])){
                System.out.println(2); return;
            }   
            else{
                System.out.println(0); return;
            }
        }

    }
}

发表于 2023-11-24 13:00:04 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String mask = in.nextLine();
            String ip1 = in.nextLine();
            String ip2 = in.nextLine();
            System.out.println(new Main().isSameMask(mask, ip1, ip2));
        }
    }
    //判断ip是否合法的方法
    public boolean isValidIp(String ip) {
        if (!ip.matches("^([0]|[1-9][0-9]{0,2})\\.([0]|[1-9][0-9]{0,2})\\.([0]|[1-9][0-9]{0,2})\\.([0]|[1-9][0-9]{0,2})$")) {
            return false;
        }
        String[] split = ip.split("\\.");
        for (String s : split) {
            if (Integer.parseInt(s) > 255) {
                return false;
            }
        }
        return true;
    }
    //转为二进制的字符串方法
    public String toBinStr(String str) {
        String[] split = str.split("\\.");
        StringBuilder sb = new StringBuilder();
        for (String s : split) {
            String binStr = Integer.toBinaryString(Integer.parseInt(s));
            while (binStr.length() < 8) {
                binStr = "0" + binStr;
            }
            sb.append(binStr);
        }
        return sb.toString();
    }
    //判断子网掩码是否合法的方法
    public boolean isValidMask(String mask) {
        if (!isValidIp(mask)) {
            return false;
        }
        String sbStr = toBinStr(mask);
        if (!sbStr.contains("0") || !sbStr.contains("1")) {
            return false;
        }
        if (sbStr.substring(sbStr.indexOf("0")).contains("1")) {
            return false;
        }
        return true;
    }
    //输入ip和子网掩码得到按位与结果的方法
    public String andOut(String ip, String mask) {
        char[] ipChs = toBinStr(ip).toCharArray();
        char[] maskChs = toBinStr(mask).toCharArray();

        char[] outCh = new char[ipChs.length];
        for (int i = 0; i < ipChs.length; i++) {
            int i1 = Integer.parseInt(String.valueOf(ipChs[i]));
            int i2 = Integer.parseInt(String.valueOf(maskChs[i]));
            outCh[i] = String.valueOf(i1 & i2).charAt(0);
        }
        return new String(outCh);
    }
    //判断两个ip是否在同一子网的方法
    public Integer isSameMask(String mask, String ip1, String ip2) {
        if (!isValidIp(ip1) || !isValidIp(ip2) || !isValidMask(mask)) {
            return 1;
        }
        if (andOut(ip1, mask).equals(andOut(ip2, mask))) {
            return 0;
        }
        return 2;
    }
}

发表于 2023-09-20 01:00:39 回复(0)
有"-255.0.0.0"这种比较难搞的输入,通过18/20.加了try catch直接有异常则打印"1",全部通过
发表于 2023-07-07 19:09:13 回复(0)
注意Integer的toBinaryString方法和&运算符
注意String的lastIndexOf方法和indexOf方法
判断是否正确真的麻烦
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    private static boolean isMaskOK (int[] aaaa) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0 ; i < 4 ; i++) {
            sb.append(Integer.toBinaryString(aaaa[i]));
        }
        String mask = sb.toString();
        boolean flag = mask.lastIndexOf('1') < mask.indexOf('0');
        return flag;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String a = in.nextLine();
            String b = in.nextLine();
            String c = in.nextLine();
            String[] aa = a.split("\\.");
            String[] bb = b.split("\\.");
            String[] cc = c.split("\\.");
            // 判断IP、子网掩码个数是否合法
            if (aa.length !=4 || bb.length != 4 || cc.length !=4) {
                System.out.println("1");
                continue;
            }
            int i = 0;
            int[] aaa = new int[4];
            int[] bbb = new int[4];
            int[] ccc = new int[4];
            // 转换为int
            for (i = 0; i < 4 ; i++) {
                aaa[i] = Integer.parseInt(aa[i]);
                bbb[i] = Integer.parseInt(bb[i]);
                ccc[i] = Integer.parseInt(cc[i]);
            }
            // 判断IP、子网掩码数值是否合法
            for (i = 0; i < 4 ; i++) {
                if (aaa[i] > 255 || bbb[i] > 255 || ccc[i] > 255 || aaa[i] < 0 || bbb[i] < 0 || ccc[i] < 0) {
                    break;
                }
            }
            if (i < 4) {
                System.out.println("1");
                continue;
            }
            // 判断子网掩码是否合法
            if (aaa[0] < 128 || !isMaskOK(aaa)) {
                System.out.println("1");
                continue;
            }

            // 判断IP是否属于同一子网
            for (i = 0 ; i < 4 ; i++) {
                if ((bbb[i] & aaa[i]) != (ccc[i] & aaa[i])) {
                    break;
                }
            }
            if (i != 4) {
                System.out.println("2");
            } else {
                System.out.println("0");
            }
        }
    }
}

发表于 2023-05-26 17:57:35 回复(0)
通过率85%,这组用例校验规则不对,预期输出1,实际为2,这组掩码不符合规范是吗
254.255.0.0
85.122.52.249
10.57.28.117

发表于 2023-05-10 15:56:02 回复(3)
 public static boolean isMask(String str){
        String[] strs = str.split("\\.");
        StringBuffer bf = new StringBuffer();
        for(int i=0;i<strs.length;i++){
            String temp= strs[i];
            if(temp.isEmpty()||Integer.parseInt(temp)<0||Integer.parseInt(temp)>255){
                return false;
            }
          String binary =  Integer.toBinaryString(Integer.parseInt(temp));
          if(binary.length()<8){
               while(binary.length()<8){
                 binary = "0".concat(binary);
               }
          }
          bf.append(binary);
        }
        return (bf.toString().contains("1")&&bf.toString().contains("0")&&bf.toString().contains("10")&&!bf.toString().contains("01"));
    }

    public static boolean isIp(String str){
        String[] strs = str.split("\\.");
        for(int i=0;i<strs.length;i++){
            String temp= strs[i];
            if(temp.isEmpty()||Integer.parseInt(temp)<0||Integer.parseInt(temp)>255){
                return false;
            }
        }
        return true;
    }

    public static String getIpMask(String str,String ip){
        String[] strs = str.split("\\.");
        String[] ips = ip.split("\\.");
        StringBuffer bf = new StringBuffer();
        for(int i=0;i<strs.length;i++){
          String temp= strs[i];
          String iptemp= ips[i];
          String binary =  Integer.toBinaryString(Integer.parseInt(temp));
          String ipbinary =  Integer.toBinaryString(Integer.parseInt(iptemp));
          if(binary.length()<8){
               while(binary.length()<8){
                 binary = "0".concat(binary);
               }
          }
          if(ipbinary.length()<8){
               while(ipbinary.length()<8){
                 ipbinary = "0".concat(ipbinary);
               }
          }
          String ipMask = "";
          for(int j=0;j<8;j++){
            char c = ipbinary.charAt(j);
            if(binary.charAt(j)=='1'){
                ipMask = ipMask.concat(String.valueOf(c));
            }else{
                ipMask = ipMask.concat("0");
            }
          }
          bf.append(ipMask);
        }
        return bf.toString();
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String mask = in.nextLine();
            String ip1 = in.nextLine();
            String ip2 = in.nextLine();
            if(!isMask(mask) || !isIp(ip1) || !isIp(ip2)){
                System.out.println(1);
            }else{
                String ip1Zi = getIpMask(mask,ip1);
                String ip2Zi = getIpMask(mask,ip2);
                if(ip1Zi.equals(ip2Zi)){
                    System.out.println(0);
                }else{
                    System.out.println(2);
                }
            }
           
        }
    }
发表于 2023-04-18 22:10:32 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String ym = in.nextLine();
            String ip1 = in.nextLine();
            String ip2 = in.nextLine();

            if (!(ipTest(ip1) && ipTest(ip2) && ymTest(ym))) {
                System.out.println("1");
                continue;
            }

            String m = invert(ip1, ym);
            String n = invert(ip2, ym);
            if (!m.equals(n)) {
                System.out.println("2");
            } else {
                System.out.println("0");
            }

        }
    }

    public static String invert(String ip, String ym) {
        String[] ips = ip.split("\\.");
        String[] yms = ym.split("\\.");
        StringBuilder sum = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            int a = Integer.parseInt(ips[i]);
            int b = Integer.parseInt(yms[i]);
            int c = a & b;
            sum.append(c);
            if (i != 3) {
                sum.append(".");
            }
        }
        return sum.toString();
    }

    public static boolean ipTest(String ip) {
        String[] ips = ip.split("\\.");
        for (int i = 0; i < ips.length; i++) {
            int a = Integer.parseInt(ips[i]);
            if (a < 0 || a > 255) {
                return false;
            }
        }
        return true;
    }


    public static boolean ymTest(String ym) {
        String[] yms = ym.split("\\.");
        StringBuilder sum = new StringBuilder();
        for (int i = 0; i < yms.length; i++) {
            int a = Integer.parseInt(yms[i]);
            if (a < 0 || a > 255) {
                return false;
            }
            String s = Integer.toBinaryString(a);
            while (s.length() < 8) {
                s = "0" + s;
            }
            sum.append(s);
        }
        if (!sum.toString().matches("[1]{1,}[0]{1,}")) {
            return false;
        }
        return true;
    }
}

发表于 2023-04-11 10:13:50 回复(0)
 public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNextLine()){
            String s = in.nextLine();
            String s1 = in.nextLine();
            String s2 = in.nextLine();
            if (s==null || s.length()==0 || s1==null || s1.length()==0 ||s2==null || s2.length()==0) {
                System.out.println(1);
                break;
            }
            boolean flag = false;
            String ss[] = s.split("\\.");
            String ss1[] = s1.split("\\.");
            String ss2[] = s2.split("\\.");

            String result = "";
            for(int i =0;i<ss.length;i++){
                if(Integer.valueOf(ss[i])<0 || Integer.valueOf(ss[i])>255
                        || Integer.valueOf(ss1[i])<0 || Integer.valueOf(ss1[i])>255
                        || Integer.valueOf(ss2[i])<0 || Integer.valueOf(ss2[i])>255
                ){
                    System.out.println(1);
                    System.exit(0);
                }
                int num = Integer.parseInt(ss[i]);
                String str =  Integer.toBinaryString(num);
                while(str.length()<8){
                    str = "0"+str;
                }
                result += str;
            }
            // 验证掩码合法性
            for(int i = 0; i <result.length()-1;i++){
                if(result.substring(i,i+2).equals("01")){
                    System.out.println(1);
                    System.exit(0);
                }
            }

            for(int i=0;i<ss.length;i++){
                if ((Integer.valueOf(ss[i]) & Integer.valueOf(ss1[i])) == (Integer.valueOf(ss[i]) & Integer.valueOf(ss2[i]))) {
                    flag = true;
                } else {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.println(0);
            }else {
                System.out.println(2);
            }
        }
    }

发表于 2022-11-18 21:50:53 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String[] subMask = in.nextLine().split("\\.");
            String[] ip1 = in.nextLine().split("\\.");
            String[] ip2 = in.nextLine().split("\\.");

            String subMaskBinary = getBinarys(subMask);
            String ip1Binary = getBinarys(ip1);
            String ip2Binary = getBinarys(ip2);
            if (!subMaskBinary.matches("1{2,}0+") || subMaskBinary.length() != 32) {
                System.out.println(1);
            } else if (ip1Binary.length() != 32) {
                System.out.println(1);
            } else if (ip2Binary.length() != 32) {
                System.out.println(1);
            } else {
                String subnet1 = getSubnet(subMaskBinary, ip1Binary);
                String subnet2 = getSubnet(subMaskBinary, ip2Binary);
                if (subnet1.equals(subnet2)) {
                    System.out.println(0);
                } else {
                    System.out.println(2);
                }
            }
        }
    }

    public static String getBinarys(String[] strs) {
        StringBuilder str = new StringBuilder("");
        for (int i = 0; i < strs.length; i++) {
            String temp = Integer.toBinaryString(Integer.parseInt(strs[i]));
            if (temp.length() < 8) {
                for (int j = 0; j < 8 - temp.length(); j++)
                    str.append("0");
            }
            str.append(temp);
        }
        return str.toString();
    }

    public static String getSubnet(String str1, String str2) {
        StringBuilder res = new StringBuilder("");
        for (int i = 0; i < 32; i++) {
            int num1 = (int)str1.charAt(i);
            int num2 = (int)str2.charAt(i);
            res.append(num1 & num2);
        }
        return res.toString();
    }

}

发表于 2022-09-24 00:36:03 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        String child = in.next();
        String p1 = in.next();
        String p2 = in.next();
        String[] biChild = parse(child);
        String[] biP1 = parse(p1);
        String[] biP2 = parse(p2);
        if (biChild == null || biP1 == null || biP2 == null) {
            System.out.println("1");
            return;
        }
        String check = "";
        for (int i = 0; i < biChild.length; i++) {
            check += biChild[i];
        }
        char prev = '1';
        char curr;
        for (int i = 0; i < check.length(); i++) {
            curr = check.charAt(i);
            if (prev == '0' && curr == '1') {
                System.out.println("1");
                return;
            }
            prev = curr;
        }
        String[] combined1 = compute(biChild, biP1);
        String[] combined2 = compute(biChild, biP2);
        for (int i = 0 ; i < 4; i++) {
            if (!combined1[i].equals(combined2[i])) {
                System.out.println("2");
                return;
            }
        }
        System.out.println("0");
    }

    public static String[] parse(String s) {
        String[] iparray = s.split("\\.");
        String[] result = new String[4];
        if (iparray.length != 4) {
            return null;
        }
        for (int i = 0; i < 4; i++) {
            int temp = Integer.valueOf(iparray[i]);
            if (temp > 255 || temp < 0) {
                return null;
            }
            String biTemp = Integer.toBinaryString(temp);
            int k = biTemp.length();
            for (int j = 0; j <  8 - k; j++) {
                biTemp = "0" + biTemp;
            }
            result[i] = biTemp;
        }
        return result;
    }

    public static String[] compute(String[] s1, String[] s2) {
        String returnString[] = new String[4];
        for (int i = 0; i < 4; i++) {
            String temp1 = s1[i];
            String temp2 = s2[i];
            String result = "";
            for (int j = 0; j < s1[i].length(); j++) {
                if (temp1.charAt(j) == '1' && temp2.charAt(j) == '1') {
                    result += "1";
                } else {
                    result += "0";
                }
            }
            returnString[i] = result;
        }
        return returnString;
    }
}

注意子掩码的valid判断,需要判断是否为降序111...0000 其他只需要琐碎的转换。主要是字符串操作考察以及题目拆解能力。同时python会好些点...
发表于 2022-09-22 04:29:09 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        String line1 = in.nextLine();
        String line2 = in.nextLine();
        String line3 = in.nextLine();
        String bin1 = "";
        String bin2 = "";
        String bin3 = "";


        for (String s : line1.split("\\.")) {
            if(!Character.isDigit(s.charAt(0))) {
                System.out.println(1);
                return;
            }
            if (Integer.parseInt(s) > 255) {
                System.out.println(1);
                return;
            } else {
                String tmp = Integer.toBinaryString(Integer.parseInt(s));
                while (tmp.length() < 8) {
                    tmp = "0" + tmp;
                }
                bin1 += tmp;
            }
        }
        for (String s : line2.split("\\.")) {
            if(!Character.isDigit(s.charAt(0))) {
                System.out.println(1);
                return;
            }
            if (Integer.parseInt(s) > 255) {
                System.out.println(1);
                return;
            } else {
                String tmp = Integer.toBinaryString(Integer.parseInt(s));
                while (tmp.length() < 8) {
                    tmp = "0" + tmp;
                }
                bin2 += tmp;
            }
        }
        for (String s : line3.split("\\.")) {
            if(!Character.isDigit(s.charAt(0))) {
                System.out.println(1);
                return;
            }
            if (Integer.parseInt(s) > 255) {
                System.out.println(1);
                return;
            } else {
                String tmp = Integer.toBinaryString(Integer.parseInt(s));
                while (tmp.length() < 8) {
                    tmp = "0" + tmp;
                }
                bin3 += tmp;
            }
        }

        // System.out.println(bin1);
        // System.out.println(bin2);
        // System.out.println(bin3);

        if (!bin1.startsWith("1")) {
            System.out.println(1);
            return;
        }
        for (int i = 0; i < bin1.length(); i++) {
            if (bin1.charAt(i) == '0') {
                // String left = bin1.substring(0,i);
                String right = bin1.substring(i);
                if (right.contains("1")) {
                    System.out.println(1);
                    return;
                }
                break;
            }
        }
        String and1 = "";
        String and2 = "";
        for (int i = 0; i < bin1.length(); i++) {

            and1 += ((bin1.charAt(i) == '1' && bin1.charAt(i) == bin2.charAt(i)) ? 1 : 0);
            and2 += ((bin1.charAt(i) == '1' && bin1.charAt(i) == bin3.charAt(i)) ? 1 : 0);
        }

        if (and1.equals(and2)) {
            System.out.println(0);
        } else {
            System.out.println(2);
        }

    }
}

发表于 2022-09-21 23:42:04 回复(0)
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.text.DecimalFormat;

public class Main{
    public static void main(String[] args) throws IOException{
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()){
            String[] str = sc.nextLine().split("\\.");
            String ziwang = "";
            boolean flag1 = false, flag2 = false, flag3 = false;
            for(String item:str){
                if(Integer.parseInt(item)>255 || Integer.parseInt(item)< 0){
                    flag1 = true;
                    break;
                } 
                item = Integer.toBinaryString(Integer.parseInt(item));
                DecimalFormat d = new DecimalFormat("00000000");
                item = d.format(Integer.valueOf(item));
                ziwang += item;
            }
            //判断子网是否合法
            int count = 0;
            for(int i = 0;i < ziwang.length();i++){
                if(ziwang.charAt(i) == '0'){
                    count = i;
                    break;
                } 
            }
            for(int i = count;i < ziwang.length();i++){
                if(ziwang.charAt(i) == '1') flag1 =true;
            }
            String[] str1 = sc.nextLine().split("\\.");
            String ip1 = "";
            for(String item:str1){
                if(Integer.parseInt(item)>=255 || Integer.parseInt(item)< 0){
                    flag2 = true;
                    break;
                }
                item = Integer.toBinaryString(Integer.parseInt(item));
                DecimalFormat d = new DecimalFormat("00000000");
                item = d.format(Integer.valueOf(item));
                ip1 += item;
            }
            
            String[] str2 = sc.nextLine().split("\\.");
            String ip2 = "";
            for(String item:str2){
                if(Integer.parseInt(item)>=255 || Integer.parseInt(item)< 0){
                    flag2 = true;
                    break;
                }
                item = Integer.toBinaryString(Integer.parseInt(item));
                DecimalFormat d = new DecimalFormat("00000000");
                item = d.format(Integer.valueOf(item));
                ip2 += item;
            }
            if(flag1||flag2||flag3){
                if(sc.hasNextLine()){
                    System.out.println("1");
                    continue;
                }
                else{
                    System.out.println("1");
                    break;
                }
            }
            //判断ip是否属于同一子网络
            int[] c1 = new int[ip1.length()];
            int[] c2 = new int[ip2.length()];
            for(int i = 0;i < ip1.length();i++){
                c1[i] = ip1.charAt(i)&ziwang.charAt(i);
                c2[i] = ip2.charAt(i)&ziwang.charAt(i);
            }
            boolean flag = false;
            for(int i = 0;i < c1.length;i++){
                if(c1[i]!=c2[i]){
                    flag = true;
                    break;
                }
            }
            if(flag) System.out.println("2");
            else System.out.println("0");
        }
        
    }
}

发表于 2022-08-29 23:51:26 回复(0)
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String mask = sc.nextLine();
            String one = sc.nextLine();
            String two = sc.nextLine();
            if (maskValid(mask)
                    || ipValid(one)
                    || ipValid(two)) {
                System.out.println(1);
                continue;
            }

            int[] num1 = string2nums(mask);
            int[] num2 = string2nums(one);
            int[] num3 = string2nums(two);
            boolean flag = false;
            for (int i = 0; i < 4; i++) {
                if ((num1[i] & num2[i]) != (num1[i] & num3[i])) {
                    flag = true;
                }
            }
            if (flag) {
                System.out.println(2);
                continue;
            }
            System.out.println(0);
        }
    }
    public static int[] string2nums(String mask) {
        String[] arr = mask.split("\\.");
        int[] num = new int[4];
        for (int i = 0; i < 4; i++) {
            num[i] = Integer.valueOf(arr[i]);
        }
        return num;
    }

    public static boolean ipValid(String mask) {
        String[] arr = mask.split("\\.");
        if (arr.length != 4) return false;
        try {
            for (String aWord : arr) {
                int aInt  = Integer.valueOf(aWord);
                if (aInt > 255 || aInt < 0) {
                    return true;
                }
            }
        } catch (Exception e) {
            return true;
        }
        return false;
    }

    public static boolean maskValid(String mask) {
        String[] arr = mask.split("\\.");
        if (arr.length != 4) return true;
         try {
            for (String aWord : arr) {
                int aInt  = Integer.valueOf(aWord);
                if (aInt > 255 || aInt < 0) {
                    return true;
                }
            }
        } catch (Exception e) {
            return true;
        }
        String res = "";
        for (String aWord : arr) {
            String key = toBinary(aWord);
            res += key;
        }
        if (!res.matches("[1]{1,}[0]{1,}")) {
            return true;
        }
        return false;
    }
    public static String toBinary(String aInt) {
        String res = "";
        res =  Integer.toBinaryString(Integer.valueOf(aInt));
        while(res.length() != 8){
            res = "0" +res;
        }
        return res;
    }
}
发表于 2022-08-18 20:46:24 回复(0)
package huawei.ip;

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

public class 是否同一组网 {

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String ym = bf.readLine();
        String ip1 = bf.readLine();
        String ip2 = bf.readLine();
        System.out.println(isValidInput(ip1, ip2, ym));

    }


    public static int isValidInput(String ip1, String ip2, String ym){

        boolean validIP1 = isValidIP(ip1);
        boolean validIP2 = isValidIP(ip2);
        boolean validYM = isValidYM(ym);

        if(!(validIP1 && validIP2 && validYM)) {
            return 1;
        }

        String str2OfIP1 = convertIp10ToIp2(ip1);
        String str2OfIP2 = convertIp10ToIp2(ip2);
        String str2OfYM = convertIp10ToIp2(ym);

        // 对 2进制 进行求 商运算
        String localNet1 = getLocalNet(str2OfIP1, str2OfYM);

        String localNet2 = getLocalNet(str2OfIP2, str2OfYM);

        return localNet1.equals(localNet2) ? 0: 2;

    }





    public static boolean isValidYM(String YM){
        if(!isValidIP(YM)) return false;

        String ym2 = convertIp10ToIp2(YM);

        // 找到第一次的0, 后面不可能是1(最后一次出现的1,必须要大于第一次出现的0)
        int firstOf0 = 0;
        int lastOf1 = 0;

        for(int i = ym2.length()-1; i >=0; i--){
            char c = ym2.charAt(i);
            if(c == '0'){
                firstOf0 = i;
            }
        }

        for(int i = 0; i < ym2.length(); i++){
            char c = ym2.charAt(i);
            if(c == '1'){
                lastOf1 = i;
            }
        }

        return firstOf0 > lastOf1;
    }


    // 判断IP是否合法
    public static boolean isValidIP(String IP){
        String[] ipArr = IP.split("\\.");

        if(ipArr.length !=4) {
            return false;
        }

        for(int i = 0; i< ipArr.length; i++){
            String segment = ipArr[i];

            int t = convertSegmentToInt(segment);

            if(!(0<=t && t <= 255)){
                return false;
            }

        }

        return true;
    }

    // 判断每一段是否合法
    public static int convertSegmentToInt(String segment){
        int n = segment.length();

        if(n > 3 || n <1) {
            return -1;
        }

        // "025" 非法的。
        if(segment.charAt(0) == '0' && segment.length() !=1){
            return -1;
        }


        // num 在【0-255】
        int num = 0;
        for(int i=0; i<n; i++){
            char c = segment.charAt(i);
            if(!('0' <= c && c <= '9')){
                return -1;
            }
            num = (c - '0') + num * 10;

        }


        return num;
    }


    public static String convertSegmentToStr(int segment){

        StringBuilder sb = new StringBuilder();

        // 将断转换为2进制 或10进制字符串。
        while(segment >0){
            sb.append(segment % 2);
            segment = segment / 2;
        }

        // 补0
        StringBuilder res = new StringBuilder();
        int n = 8 - sb.length();
        while (n > 0){
            res.append("0");
            n--;
        }
        sb.reverse();
        res.append(sb);

        return res.toString();

    }


    public static String convertIp10ToIp2(String ip10){

        // 已经是合法的IP了。
        String[] arr = ip10.split("\\.");

        StringBuilder ip2 = new StringBuilder();

        for(int i=0; i<arr.length; i++){
            String segmentStr = arr[i];
            int segInt = convertSegmentToInt(segmentStr);
            ip2.append(convertSegmentToStr(segInt));
            if(i < arr.length -1){
                ip2.append(".");
            }
        }

        return ip2.toString();
    }


    public static String getLocalNet(String ipOfStr2, String ymOfStr2){

        StringBuilder localNet = new StringBuilder();
        for(int i=0; i<ipOfStr2.length(); i++){
            char c1 = ipOfStr2.charAt(i);
            // 如果是.
            if(c1 == '.') {
                localNet.append(".");
                continue;
            }
            char c2 = ymOfStr2.charAt(i);
            int c3 = ((c1 - '0') + (c2 - '0'))/2 ;
            localNet.append(c3);
        }

        return localNet.toString();
    }
}

发表于 2022-08-18 09:36:00 回复(0)

问题信息

难度:
60条回答 54048浏览

热门推荐

通过挑战的用户

查看代码