【华为】4个常考IP地址的题型

题目一:

小知识:split分隔符总结:

1.字符"|","*","+"都得加上转义字符,前面加上"\\"。
2.而如果是"\",那么就得写成"\\\\"。(不过我看过有写成"\\"的)
3.如果一个字符串中有多个分隔符,可以用"|"作为连字符。

4.如果是""",就变成了"\""

package test;
import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String[] ips = new String[4];
        for (int i = 0; i < 4; i++) {
            ips[i] = input.nextLine();
        }
        int ip1, ip2, ip3, ip4;
        String[] tmp = new String[4];
        for (int i = 0; i < 4; i++) {
            tmp[i] = (ips[i].split("\\."))[0];
        }
        ip1 = Integer.parseInt(tmp[0]);
        ip2 = Integer.parseInt(tmp[1]);
        ip3 = Integer.parseInt(tmp[2]);
        ip4 = Integer.parseInt(tmp[3]);

        if (ip1 <= ip2) {
            if ((ip3 < ip1 && ip4 < ip1) || ip3 > ip2 && ip4 > ip2) {
                System.out.println("No Overlap IP");
            } else {
                System.out.println("Onverlap IP");
            }
        } else {
            if ((ip3 < ip2 && ip4 < ip2) || (ip3 > ip1 && ip4 > ip1)) {
                System.out.println("No Overlap IP");
            } else {
                System.out.println("Onverlap IP");
            }
        }
    }
}

题目二:

  1. 例子:
  2. 第一个IP地址:

    192.168.1.9

    子网掩码:255.255.255.0

    第二个ip地址:

    192.168.1.10

    子网掩码:255.255.255.0

  3. 将他们做与运算,首先要将十进制的ip地址转换为二进制的。

    第一个IP地址:

    11000000.10101000.00000001.00001001

    子网掩码:11111111.11111111.11111111.00000000

    第二个ip地址:

    11000000.10101000.00000001.00001010

    子网掩码:11111111.11111111.11111111.00000000

  4. 与运算结果:

    11000000.10101000.00000001.00000000

    他们得出来的结果是一样的,转换成十进制是:192.168.1.0。所以192.168.1.9和192.168.1.10

    是在同一个网段中的。

小知识:sc.next() 和 sc.nextLine 的区别

两个都是用来接收用户的输入,区别在于: 
next()从遇到第一个有效字符(非空格、换行符)开始扫描,遇到第一个分隔符或结束符(空格’ ‘或者换行符 ‘\n’)时结束。 nextLine()则是扫描剩下的所有字符串直到遇到换行符 ‘\n’为止。**

我们来举个例子,对于如下输入:

Scanner sc = new Scanner(System.in);
//加入输入的是:aaa bbb ccc
str1=sc.next();
//str1="aaa"
str2=sc.nextline();
//str2=" bbb ccc"

解释一下原因:
首先对于输入的数据,在计算机中实际表示是这样的,包含三个空格和一个换行符: 
aaa bbb ccc \n 
next()函数从遇到的第一个有效的字符a开始扫描,直到遇到第一个空格扫描结束,得到字符串”aaa” 
nextLine()函数从空格开始扫描直到遇到\n符结束,故得到字符串是 ” bbb ccc”,注意这里bbb前面还有一个空格 
所以如果要同时使用next()和nextLine()时,要慎用,因为联合使用时就是一个整体,next在前,nextLine靠后,扫描接受的是同一行上的字符串,只不过接收的是不同内容罢了。

题解:

package test;
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        while (sc.hasNext()){
            String s1=sc.next(),s2=sc.next(),s3=sc.next();
            String[] s11=s1.split("\\."),s22=s2.split("\\."),s33=s3.split("\\.");
            String s1133=new String(),s2233=new String();
            for (int i = 0; i <s11.length; i++) {               //结果存储
                s1133+= yu(s11[i],s33[i])+".";
                s2233+= yu(s22[i],s33[i])+".";
            }
            if (s1133.equals(s2233)) System.out.print(1+" ");   //判断相等
            else System.out.print(0+" ");
            System.out.println(s1133.substring(0,s1133.length()-1));
        }
    }
    public static int yu(String s1s,String s2s){  //字符串与
        return Integer.parseInt(s1s)&Integer.parseInt(s2s);
    }
}

题目三:

IP地址到整数之间的转换

题目:给定一个IP地址,例如:
一个ip地址为10.0.3.193
每段数字相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。需要对IP地址进行校验。

输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址

输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址

输入例子:
10.0.3.193
167773121

输出例子:
167773121
10.3.3.193

小知识:java的int的取值范围

1、java中int的取值范围为-2147483648到+-2147483648。

2、首先jdk中定义int占4个字节32位,32位就是jvm仅仅给分配32个格子的空间,用以存放数据。

3、计算机中用0和1存放数据。那么,32个格子中放满0或1的方法,有2的32次方种。

4、但是java中int有正负之分,所以32个格子中占用一个格子标识正负,仅仅能用31个格子来标识数值。最后int能标识的最大/最小数字是:2的31次方即+/- 2147483648。取值范围即为二者之间。

package test;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String Ip=sc.next();
            String inter=sc.next();
            ipToInteger(Ip);
            IntegerToIp(inter);
        }
    }
    public static void ipToInteger(String Ip){
        String[] ips=Ip.split("\\.");
        int sum=0;
        long inter=0;
        if(ips.length!=4) {
        } else {
            for(int i=0;i<4;i++) {
                sum=0;
                for(int j=0;j<ips[i].length();j++) {
                    char ch=ips[i].charAt(j);
                    if('0'<=ch&&ch<='9') {
                        sum=10*sum+ch-'0';
                    }
                }
                inter=(inter<<8)+sum;
            }
        }
        System.out.println(inter);
    }
    public static void IntegerToIp(String sinter){
        StringBuffer ip=new StringBuffer();
        long inter=Long.parseLong(sinter);
        int[] ips=new int[4];
        for(int i=0;i<4;i++){
            int sum=(int) (inter & 255);
            inter=inter>>8;
            ips[3-i]=sum;
        }
        for(int i=0;i<4;i++){
            if(i!=3)
                System.out.print(ips[i]+".");
            else
                System.out.println(ips[i]);
        }
    }
}

题目四:

如何判断一个IP地址是否合法?

题目:判断输入的字符串是不是一个有效的IP地址

package test;
import java.util.*;
public class Main {
    public static void main(String [] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()) {
            String str=sc.next();
            String[] array=str.split("\\.");
            int count=0;
            for(int i=0;i<array.length;i++) {
                int p=Integer.parseInt(array[i]);
                if(p>=0&&p<=255) {
                    count+=1;
                }
            }
            if(count==4) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值