首页 > 学院 > 开发设计 > 正文

华为2017校招机试题第一题同网CS

2019-11-10 21:43:04
字体:
来源:转载
供稿:网友
描述:小明同学最近新购置了电脑,想和其他同学玩CS,但是建了局域网游戏之后,别人加不进来,自己也进不了别人的主机,非常苦恼。于是来请教同宿舍的“科技怪人”小犀,小犀说了句“你的ip和我们不在同一个子网”就闪了,小明百度了一下,搜到如下关于“子网掩码”的信息:子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网里面,可以进行直接的通讯。运算演示之一:I P 地址  192.168.0.1子网掩码  255.255.255.0转化为二进制进行运算:I P 地址 11010000.10101000.00000000.00000001子网掩码 11111111.11111111.11111111.00000000AND运算     11010000.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.00000000AND运算     11010000.10101000.00000000.00000000转化为十进制后为:      192.168.0.0运算演示之三:I P 地址  192.168.0.4子网掩码  255.255.255.0转化为二进制进行运算:I P 地址 11010000.10101000.00000000.00000100子网掩码 11111111.11111111.11111111.00000000AND运算     11010000.10101000.00000000.00000000转化为十进制后为:      192.168.0.0通过以上对三组计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0所以计算机就会把这三台计算机视为是同一子网。小明灵机一动,打算做一个帮助大家解决局域网游戏问题的工具,设想如下:我知道我的电脑的IP和子网掩码,又知道另外几个同学的ip地址,通过这个工具就可以知道我可以和谁一起CS。IP寻址规则:A.网络标识不能数值127开头(在A类地址中127.0.0.1是loopback IP)B.网络标识第一个字节不能是255和0C.IP每个字段不能大于255子网掩码:A. 不能全部是255;B. 不能全部是0;C. 掩码的高位(bit)必须是连续的1; 例如 : 255.255.252.0 --> 11111111.11111111.11111100.00000000 按照Bit来看1和0的位必须是连续的,而掩码高位都是1,所以有时候会见到 错误 : 255.255.253.0 --> 11111111.11111111.11111101.00000000 这里就出现bit为1但没有连续的情况,这种掩码是不正确的 运行时间限制:无限制内存限制:无限制输入:第一行是我的电脑的IP地址第二行是我的电脑的子网掩码第三行整数N,表示后面N个同学的IP地址第1个同学的IP地址......第N个同学的IP地址输出:计算并输出N个IP地址是否与我的电脑在同一子网内。对于在同一子网的输出:let's rock对于在不同子网的输出:not you对于无效的联网IP输出:Invalid IP address.对于无效的子网掩码:Invalid netmask address.样例输入:192.168.0.1255.255.255.03192.168.0.2192.168.0.200192.168.2.2样例输出:let's rocklet's rocknot you答案提示: 参考测试用例:测试用例1:输入:10.123.12.7255.0.0.0310.121.234.1192.168.19.910.124.123.2输出:let's rocknot youlet's rock测试用例2:输入:192.168.29.1255.255.255.02127.0.0.1192.168.29.100输出:Invalid IP address.let's rock测试用例3:输入:10.144.240.73255.252.253.0输出:Invalid netmask address.测试用例4:输入:10.144.240.730.0.0.0输出:Invalid netmask address.测试用例5:输入:10.146.240.256输出:Invalid IP address.测试用例6:输入:255.148.240.1输出:Invalid IP address.测试用例7:输入:0.147.240.15输出:

Invalid IP address.

程序:import java.util.Scanner;import java.util.regex.Pattern;public class First { //IP测试 public static String IPTest(String str){  String[] s=str.split("//.");//注意split中以.分割是加//  String s0=s[0];  if(s0.equals("127")||s0.equals("0")||s0.equals("255"))   return "Invalid IP Address";  for(int i=0;i<s.length;i++){   if(Integer.parseInt(s[i])>255)    return "Invalid IP Address";  }  return null; } //子网掩码测试 public static String YanMaTest(String str){  if(str.equals("255.255.255.255")||str.equals("0.0.0.0"))   return "Invalid netmask address.";  String[] s=str.split("//.");  String regex="0?1+0+1+0?";  Pattern pattern=Pattern.compile(regex);  for(int i=0;i<3;i++){   s[i]=Integer.toBinaryString(Integer.parseInt(s[i]));   boolean flag=pattern.matcher(s[i]).find();   if(flag)    return "Invalid netmask address.";  }  return null; } //逻辑与 public static String AND(String str1,String str2){  String[] s1=str1.split("//.");  String[] s2=str2.split("//.");  String str="";  for(int i=0;i<s1.length;i++){   s1[i]=Integer.toBinaryString(Integer.parseInt(s1[i]));   s2[i]=Integer.toBinaryString(Integer.parseInt(s2[i]));   int count1=8-s1[i].length();   for(int j=0;j<count1;j++){    s1[i]="0"+s1[i];   }   int count2=8-s2[i].length();   for(int j=0;j<count2;j++){    s2[i]="0"+s2[i];   }   char[] ch1=s1[i].toCharArray();   char[] ch2=s2[i].toCharArray();   char[] ch=new char[8];   int count=0;   for(int j=0;j<8;j++){    if(ch1[j]=='1'&&ch2[j]=='1')     ch[j]='1';    else     ch[j]='0';   }   for(int j=0;j<8;j++){    count+=ch[j]*Math.pow(2, 7-j);   }   if(i==3)    str=str+String.valueOf(count);   else    str=str+String.valueOf(count)+".";  }  return str; }//主函数: public static void main(String[] args){  System.out.PRintln("输入:");  Scanner sc=new Scanner(System.in);  String myIP="";  String netmask="";  String otherIP="";  String result="";  int count=0;  int num=0;  while(sc.hasNext()){   count+=1;   if(count==1){    myIP=sc.next();        String str=IPTest(myIP);    if(str!=null){     System.out.println(str);     return ;    }   }   if(count==2){    netmask=sc.next();    String str=YanMaTest(netmask);    if(str!=null){     System.out.println(str);     return;    }   }   if(count==3)    num=sc.nextInt();   if(count>3){    otherIP=sc.next();    String str=IPTest(otherIP);    if(str!=null){     result+="Invalid IP address"+System.getProperty("line.separator");    }    else{     String myAnd=AND(myIP,netmask);     String otherAnd=AND(otherIP,netmask);     if(myAnd.equals(otherAnd))      result+="let's rock"+System.getProperty("line.separator");     else      result+="not you"+System.getProperty("line.separator");    }   }   if(count==3+num){    System.out.println("输出:");    break;   }  }  System.out.println(result); } }
上一篇:发送邮件

下一篇:Django template 过滤器

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表