题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.math.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.stream.*;
import java.util.regex.*;
import java.util.function.*;
import java.net.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
String mask = in.nextLine();
String ip1 = in.nextLine();
String ip2 = in.nextLine();
if (!isMaskIleagl(mask) || !isIPIleagl(ip1) || !isIPIleagl(ip2)) {
System.out.println(1);
continue;
}
if (maskIP(mask, ip1).equals(maskIP(mask, ip2))) {
System.out.println(0);
} else {
System.out.println(2);
}
}
}
static String maskIP(String mask, String ip) {
List<String> list = new ArrayList<>();
String[] m = mask.split("\\.");
String[] p = ip.split("\\.");
for (int i = 0; i < 4; i++) {
int and = Integer.parseInt(m[i]) & Integer.parseInt(p[i]);
list.add(String.valueOf( and ));
}
return String.join(".", list);
}
static boolean isIPIleagl(String ip) {
try {
InetAddress address = InetAddress.getByName(ip);
return address.getHostAddress().equals(ip);
} catch (UnknownHostException e) {
return false;
}
}
static boolean isMaskIleagl(String mask) {
if (!isIPIleagl(mask)) {
return false;
}
String[] nums = mask.split("\\.");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
String bStr = Integer.toBinaryString(Integer.parseInt(nums[i]));
// 技巧!!
bStr = String.join("", Collections.nCopies(8 - bStr.length(), "0")) + bStr;
sb.append(bStr);
}
// 符合先 1 后 0
boolean has0 = false;
for (int i = 0; i < sb.length(); i++) {
if ('0' == sb.charAt(i)) {
has0 = true;
}
if (has0 && '1' == sb.charAt(i)) {
return false;
}
}
return true;
}
}

