一、问题背景
博主最近在准备2020年的软件工程编程领域的春招,其中华为提供了博主上机考试的机会,因此博主参加了2020年3月25日的华为校园春招。其中博主李同学做出了2020年3月25日华为校园春招真题的第1题和第2题,第1题的题目描述和Java代码实现如下文所示,但第2题的题目描述和Java代码实现请见博主的此篇文章2020年3月25日华为春招真题第2题详解+Java代码实现——最大正方形子矩阵。
二、2020年3月25日华为校园春招真题的第1题(2进制与10进制的相互转换)
1.题目描述
题目描述:根据给定的两个IP地址和一个子网掩码,计算这两个IP地址的网关。若这两个IP地址的网关相同,则输出1和第一个IP地址的网关;若这两个IP地址的网关不相同,则输出0和第一个IP地址的网关。
若输入以下两个IP地址和一个子网掩码:
192.168.1.1 192.168.1.2 255.255.255.0
上述输入对应的输出为:
1 192.168.1.0
若输入以下两IP地址和一个子网掩码,例如:
192.168.1.1 192.168.2.1 255.255.255.0
上述输入对应的输出为:
0 192.168.1.0
2.Java代码实现
import java.util.Scanner;
public class Problem1ofHuawei {
public static void main(String[] args) {
//分别用3个String数组存储 2个ip地址和子网掩码的各个10进制的数
Scanner scanner=new Scanner(System.in);
//每个字符串数组有4个字符串类型的数,对应10进制的ip地址和子网掩码(如192、168、1、1)
String[] ip1=scanner.next().split("\\.");
String[] ip2=scanner.next().split("\\.");
String[] subnetMask=scanner.next().split("\\.");
//用3个二维数组分别存储2进制的ip地址和子网掩码
int[][] ip1Binary=new int[4][8];
int[][] ip2Binary=new int[4][8];
int[][] subnetMaskBinary=new int[4][8];
//二进制转化为十进制
for (int i = 0; i < ip1Binary.length; i++) {
ip1Binary[i]=tenToBinary(Integer.parseInt(ip1[i]));
ip2Binary[i]=tenToBinary(Integer.parseInt(ip2[i]));
subnetMaskBinary[i]=tenToBinary(Integer.parseInt(subnetMask[i]));
}
//ip1的网关
int[] ip1Gateway=ipGateway(ip1Binary,subnetMaskBinary);
//ip2的网关
int[] ip2Gateway=ipGateway(ip2Binary,subnetMaskBinary);
//判定ip1与ip2网关是否相等,相等返回1,否则返回0
if (ip1Gateway[0]==ip2Gateway[0] && ip1Gateway[1]==ip2Gateway[1] && ip1Gateway[2]==ip2Gateway[2] && ip1Gateway[3]==ip2Gateway[3]){
System.out.print("1 ");
}else {
System.out.print("0 ");
}
//根据题意再输出ip1的网关
for (int i = 0; i < ip1Gateway.length; i++) {
System.out.print(ip1Gateway[i]);
//输出 在两个数值之间的英文句号.
if (i!=ip1Gateway.length-1){
System.out.print(".");
}
}
}
//将ip地址和子网掩码的每个10进制数转化为2进制的int类型数组,0~255用8位即可表达
public static int[] tenToBinary(int number10){
//长度为8的int数组存储number10的二进制表示
int[] numberArray2=new int[8];
for (int i = 0; i < 8; i++) {
//255是否大于128,是的话 数组第0位置为1,再将255-128=127
if (number10>=Math.pow(2,7-i)){
numberArray2[i]=1;
number10-=Math.pow(2,7-i);
}else{
numberArray2[i]=0;
}
}
return numberArray2;
}
//通过形式参数中的IP地址和子网掩码,来计算出IP地址的网关
public static int[] ipGateway(int[][] ip,int[][] subnetMask){
//二维数组的长度是[4][8]
int[][] gateway=new int[4][8];
for (int i = 0; i < ip.length; i++) {
for (int j = 0; j < ip[0].length; j++) {
if (ip[i][j]==1 && subnetMask[i][j]==1){
gateway[i][j]=1;
}else {
gateway[i][j]=0;
}
}
}
//经过上面的计算,gateway是一个2进制的ip网关,还需要转换为10进制
int[] gateway10=new int[4];
for (int i = 0; i < gateway10.length; i++) {
gateway10[i]=binaryToTen(gateway[i]);
}
return gateway10;
}
//将2进制的int型数组转换为一个10进制的int型整数
public static int binaryToTen(int[] binaryNumber){
int number10=0;
for (int i = 0; i < 8; i++) {
if (binaryNumber[i]==1){
number10+=Math.pow(2,7-i);
}
}
return number10;
}
}