题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) {
String mask = in.nextLine();
String ip1 = in.nextLine();
String ip2 = in.nextLine();
if(isWrongMask(mask) || isWrongIp(ip1) || isWrongIp(ip2)){
System.out.println(1);
continue;
}
if(isSameNet(ip1,ip2, mask)){
System.out.println(0);
continue;
}
else{
System.out.println(2);
}
}
}
public static boolean isWrongMask(String mask) {
String[] masks = mask.split("\\.");
if (masks.length != 4) {
return true;
}
int[] num = new int[4];
for (int i = 0 ; i < 4 ; ++i) {
if (Integer.valueOf(masks[i]) < 0 || Integer.valueOf(masks[i]) > 255) {
return true;
} else {
num[i] = Integer.valueOf(masks[i]);
}
}
StringBuilder maskBinary = new StringBuilder();
for (int i = 0 ; i < 4 ; ++i) {
StringBuilder sb = new StringBuilder();
while (num[i] > 0) {
if (num[i] % 2 == 1) {
sb.append('1');
} else {
sb.append('0');
}
num[i]>>=1;
}
while (sb.length() < 8) {
sb.append('0');
}
maskBinary.append(sb.reverse());
}
//System.out.println(maskBinary);
//判断是否前1后0
for (int i = 0 ; i < maskBinary.length() - 1 ; ++i) {
if (maskBinary.charAt(i) == '0' && maskBinary.charAt(i+1) == '1') {
return true;
}
}
return false;
}
public static boolean isWrongIp(String ip) {
String[] ips = ip.split("\\.");
if (ips.length != 4) {
return true;
}
for (int i = 0 ; i < 4 ; ++i) {
if (Integer.valueOf(ips[i]) < 0 || Integer.valueOf(ips[i]) > 255) {
return true;
}
}
return false;
}
public static boolean isSameNet(String ip1, String ip2, String mask) {
String[] ip1s = ip1.split("\\.");
String[] ip2s = ip2.split("\\.");
String[] masks = mask.split("\\.");
for(int i=0 ; i<4 ; ++i){
int x = Integer.valueOf(ip1s[i]);
int y = Integer.valueOf(ip2s[i]);
int z = Integer.valueOf(masks[i]);
if((z&x) != (z&y)){
return false;
}
}
return true;
}
}

