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

(java实现)


问题

题目描述:

子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
示例:
I P 地址  192.168.0.1
子网掩码  255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.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 地址 11010000.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:

输入

255.255.255.0
192.168.224.256
192.168.10.4
255.0.0.0
193.194.202.15
232.43.7.59

输出

1
2

问题分析:

1、先判断子网掩码是否合法;
2、再判断输入的IP是否合法;
3、在子网掩码的位数下,比较两个IP二进制是否相同;
注意:在将整数转为二进制字符串时,要考虑补齐够8位数

相关知识:

1、将整数转为二进制字符串:int tmp = Integer.toBinaryString(re); //转为二进制
2、将IP内的数分离出来,“.”为特殊字符,需要用双反斜杠“\”: String[] str = s.split("\."); //传入IP地址,并将其拆分为多个数;
其次使用函数,将字符串转为整数: int re = Integer.parseInt(str[i]);
3、java十进制转换成二进制数
牢记常用的!
1.十进制转成二进制
String s = Integer.toBinaryString(n) //将十进制数转成字符串,例如n=5 ,s = “101”
2.将字符串转成整形
int a = Integer.valueof(“1002”); //当然s只能是数字类的字符串
或者
int a = Integer.parseInt(“1002”);
3.将整形转成字符串
String s = String.valueof(1025); 直接转成了
4.将整形转成十六进制的数
String s = Integer.toHexString(18); //输出结果12

算法实现:

参考代码:

import java.util.*;
 
public class Main {
         
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        while (input.hasNext())
        {
            String s0 = input.nextLine();
            String s01 = input.nextLine();
            String s02 = input.nextLine();
             
            String res = intToStr(s0);
            String res1 = intToStr(s01);
            String res2 = intToStr(s02);
            if (res.equals("false") || res1.equals("false") || res2.equals("false"))
            {
                System.out.println("1");    //非法
                continue;
            }
            //统计子网掩码 1 的个数
            char[] ch = res.toCharArray();
            int count = 0;
            for (int i=0; i<ch.length; i++)
            {
                if (ch[i]=='1')
                {
                    count++;
                }
                else{
                    break;
                }
            }
            boolean flag = true;
            for (int i=count; i<ch.length; i++)
            {
                if (ch[i]=='1')
                {
                    flag = false;
                    break;
                }
            }
            if (!flag)
            {
                System.out.println("1");    //检测子网掩码非法,得是:网络号部分全为“1”和主机号部分全为“0”
                continue;
            }
             
            char[] ch1 = res1.toCharArray();
            char[] ch2 = res2.toCharArray();
            int ni = 0;
            for(; ni<count; ni++)
            {
                if (ch1[ni]!=ch2[ni]) //比较两个子网掩码
                {
                    break;
                }
            }
            if (count == ni)
            {
                System.out.println("0");
            }else
            {
                System.out.println("2");
            }
        }
    }
     
    public static String intToStr(String s)
    {
        String[] str = s.split("\\.");  //传入IP地址,并将其拆分
        String res = "",tmp,t;
        for (int i=0; i<str.length; i++)
        {
            int re = Integer.parseInt(str[i]);   
            if (re>=0 && re<=255)
            {
                tmp = Integer.toBinaryString(re);    //转为二进制
                //补齐8位数
                t = "";
                for (int j=0; j<8-tmp.length(); j++)
                {
                    t += "0";
                }
                res = res + t + tmp;
            }
            else
                return "false";  //非法
        }
        return res;
    }
}
全部评论

相关推荐

02-01 19:48
门头沟学院 Java
神哥了不得:(非引流)直接暑期吧,没时间日常了,老鱼简历把水印去了,或者换个模板,简历字体大小都不太行,建议换2个高质量的项目,面试应该还会再多一些
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
2024-12-30 18:02
程序员牛肉:1.可以标记一下自己的学校是985,有一些hr可能没想到你这个院校是985的。 2.简历所呈现出来的能力还是有点差的,苍穹外卖+黑马点评。这在java技术域里面也就是刚学三四个月的样子,大厂现在招人少,小厂又更加希望你能直接过来干活。就你简历上呈现出来的能力,确实是有点难找,肉眼可见的不懂技术。 第一个项目中:简单的使用redis也算是亮点嘛?使用jwt,threadlocal也算是亮点?你不就是调了几个包嘛?Nginx作为服务器也能写出来,这不是前端的活嘛? 第二个项目中:分布式锁+mq消息队列+Lua队列。真没啥好问的。属于面试官看一眼就阳痿的简历,没有任何想提问的欲望。 我给你建议是好好的挖一挖这个项目吧,其实苍穹外卖和黑马点评这两个项目很不错了,只不过是太烂大街了导致面试官没啥问的兴趣,所以不太推荐写简历上。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务