携程第二批笔试题

1. 在软件系统中,经常会使用到IP黑名单功能。例如下面的黑名单样例,条目可能是单个IP,也可能是一个子网,IP黑名单样例

62.33.12.122

221.58.4.0/24

8.9.88.1

……

请构建数据结构,在加载黑名单后,能判定给定的IP是否命中指定的IP黑名单。

输入:

第一行输入指定的IP地址,IPv4格式输入;

第二行输入指定的IP黑名单地址,可以是一个IPv4地址,或一个子网地址。

输出:

判断指定的IP是否命中指定的IP黑名单

样例输入:

2.33.128.9

2.33.128.0/24

样例输出:

1

计算机网络知识点:

IP地址

IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信。我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”,而Internet中的路由器,就相当于电信局的“程控式交换机”。

IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。

网络地址:

1、如果是192的C段地址,那么,网络地址就是:192.168.1.0,地址掩码是:255.255.255.0。

2、如果地址掩码是:255.255.0.0,那么网络地址就是:192.168.0.0。

3、网络地址很大一部分是由地址掩码决定的。

子网掩码

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。

子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。

子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。

子网掩码——屏蔽一个IP地址的网络部分的“全1”比特模式。对于A类地址来说,默认的子网掩码是255.0.0.0;对于B类地址来说默认的子网掩码是255.255.0.0;对于C类地址来说默认的子网掩码是255.255.255.0。

通过子网掩码,就可以判断两个IP在不在一个局域网内部。

子网掩码可以看出有多少位是网络号,有多少位是主机号

ip段/数字-如192.168.0.1/24是什么意思?

后面这个数字标示了我们的网络号的位数,也就是子网掩码中前多少号为1

129.168.1.1 /24 这个24就是告诉我们网络号是24位

也就相当于告诉我们了

子网掩码是:11111111 11111111 11111111 00000000

即:255.255.255.0

172.16.10.33/27 中的/27

也就是说子网掩码是255.255.255.224 即27个全1

子网掩码是:11111111 11111111 11111111 11100000

192.168.2.0/24表示的IP范围

192.168.2.0换成32位二进制,四组,每组8位

/24 表示前24位不变,后8位由全0变化到全1的过程,也就是由“00000000”变化到“11111111”

又因为全0是子网网络地址,全1是子网广播地址,这两个地址是不分配给主机使用的。

所以有效的可分配的范围是前24位不变,后8位由“00000001”变化为“11111110”的范围

再转换回十进制就是192.168.2.1~192.168.2.254

编码解题:

import java.util.Scanner;
public class Problem16 {
    static boolean CheckBlackList(String userIP, String blackIP) {
        String[] user = userIP.split("\\.");
        String[] black = blackIP.split("\\.");
        if (black[black.length-1].contains("/")) {
            String temp = black[black.length-1];
            String[] qujian = temp.split("/");
            int num = Integer.valueOf(qujian[1]);
            int change  = 32 - num;
            int count = (int) Math.pow(2,change);
            int userIp = Integer.valueOf(user[user.length-1]);
            if (userIp >= 0 && userIp <= count) {
                return true;
            }
        } else {
            for (int i = 0; i < user.length-1; i++) {
                if (!user[i].equals(black[i])) {
                    return false;
                }
            }
        }
        if (user[user.length-1].equals(black[black.length-1])) {
            return true;
        }
        return false;
    }
    /******************************结束写代码******************************/
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        boolean res;
        String _userIP;
        try {
            _userIP = in.nextLine();
        } catch (Exception e) {
            _userIP = null;
        }
        String _blackIP;
        try {
           _blackIP = in.nextLine();
        } catch (Exception e) {
            _blackIP = null;
        }
        res = CheckBlackList(_userIP, _blackIP);
        System.out.println(String.valueOf(res ? 1 : 0));
    }
}

因为第二题比较难,还没什么思路。因此跳过

3.豚厂开发了一个酒店客服机器人,机器人要送水到客人房间,此时机器人在一个M*N网格的左上角,客人房间在右下角,这个机器人在任意点只能向下或者向右移动一步,机器人要把水送到客人房间,有多少种可能的唯一路径?

说明:

网格中的障碍物和空位置分别用1和0表示

M*N的值均不超过100

输入:

第一行输入网格的长款M和N

第二行至M+1行输入障碍物和空位,以空格分开

输出:

机器人在给定网络上可能的路径数。

输入样例:

3

3

0 0 0

0 1 0

0 0 0

输出样例:

2

解决方案:

import java.util.Scanner;
public class Main {
 public static int sum = 0;
 public static void main(String[] args) {
  Scanner scan = new Scanner(System.in);
     int M = scan.nextInt();
     int N = scan.nextInt();
     int[][] data = new int[M][N];
     for(int i=0;i<M;i++) {
      for(int j=0;j<N;j++) {
       data[i][j]=scan.nextInt();
      }
     }
     caj(data,0,0,M,N);
     System.out.println(sum);
 }
 public static void caj(int[][] data,int i,int j,int M,int N) {
  if(i==(M-1) && j==(N-1)) {
   sum++;
  }
  if((i+1)<=(M-1)) {
   if(data[i+1][j]!=1)caj(data,i+1,j,M,N);
  }
  if((j+1)<=(N-1)) {
   if(data[i][j+1]!=1)caj(data,i,j+1,M,N);

  }
 }
}

猜你喜欢

转载自www.cnblogs.com/yanglanwan/p/11672397.html