题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
String mask = in.next();
String ip1 = in.next();
String ip2 = in.next();
//判断掩码
boolean checkMask = maskCheck(mask);
//检查ip
boolean checkIp1 = ipCheck(ip1);
boolean checkIp2 = ipCheck(ip2);
boolean checkResult = checkIp1 && checkIp2 && checkMask;
if (checkResult) {
//转二进制
String mb = toBinary(mask);
String b1 = toBinary(ip1);
String b2 = toBinary(ip2);
//ip和掩码与运算
int same = 0;
for (int i = 0; i < 32; i++) {
char m = mb.charAt(i);
char c1 = b1.charAt(i);
char c2 = b2.charAt(i);
char compute1 = 'a';
char compute2 = 'a';
if (m == '1' && c1 == '1') {
compute1 = '1';
} else {
compute1 = '0';
}
if (m == '1' && c2 == '1') {
compute2 = '1';
} else {
compute2 = '0';
}
//是否同一子网判断
if (compute1 != compute2) {
same++;
break;
}
}
if (same == 0) {
System.out.println(0);
} else {
System.out.println(2);
}
} else {
System.out.println(1);
}
}
}
public static boolean maskCheck(String mask) {
String[] facs = mask.split("\\.");
if (facs.length != 4) {
return false;
} else {
//检查值的范围
String binaryIp = "";
for (int i = 0; i < 4; i++) {
String temp = facs[i];
int value = Integer.parseInt(temp);
if (value < 0 || value > 255) {
return false;
} else {
//转二进制
String b = Integer.toBinaryString(value);
if (b.length() < 8) {
for (int j = 0; j < 8 - b.length(); j++) {
b = "0" + b;
}
}
binaryIp += b;
}
}
//检查掩码的0和1位置
int start = 0;
for (int i = 0; i < binaryIp.length(); i++) {
//找到第一个不是1的位置
if (binaryIp.charAt(i) != '1' && start == 0) {
start = i - 1;
}
}
for (int i = 0; i <= start; i++) {
if (binaryIp.charAt(i) != '1') {
return false;
}
}
for (int i = start + 1; i < binaryIp.length(); i++) {
if (binaryIp.charAt(i) != '0') {
return false;
}
}
}
return true;
}
public static boolean ipCheck(String ip) {
//长度检查
String[] facs = ip.split("\\.");
if (facs.length != 4) {
return false;
} else {
//检查值的范围
for (int i = 0; i < 4; i++) {
String temp = facs[i];
int value = Integer.parseInt(temp);
if (value < 0 || value > 255) {
return false;
}
}
}
return true;
}
public static String toBinary(String str) {
//长度检查
String binaryIp = "";
String[] facs = str.split("\\.");
for (int i = 0; i < 4; i++) {
String temp = facs[i];
int value = Integer.parseInt(temp);
//转二进制
String b = Integer.toBinaryString(value);
//不足8位补0
int length=b.length();
if (length< 8) {
for (int j = 0; j < 8 - length; j++) {
b = "0" + b;
}
}
binaryIp += b;
}
return binaryIp;
}
}
耗时约55min。。。。。。
