题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
都转为32位的二进制后,如果子网掩码的1有n位,那么ip1和ip2的前n位必须相同,他们才是统一子网。
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.hasNext()) { // 注意 while 处理多个 case
String mar = in.next();
String ip1 = in.next();
String ip2 = in.next();
if (!(isMark(mar) && isIp(ip1) && isIp(ip2))) {
System.out.println(1);
continue;
}
String sMark = ipToString(mar);
// 找到0的位置,这个位置之前的二进制必须相同才属于同一网络
int index = sMark.indexOf("0");
String sIp1 = ipToString(ip1);
String sIp2 = ipToString(ip2);
if(sIp1.substring(0,index).equals(sIp2.substring(0,index))){
System.out.println(0);
}else{
System.out.println(2);
}
}
}
// 将ip地址转为32位二进制
public static String ipToString(String ip) {
String[] arr = ip.split("\\.");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
// 将子网掩码转为二进制字符串
String s = Integer.toString(Integer.parseInt(arr[i]), 2);
if (s.length() < 8) {
for (int j = 0; j + s.length() < 8; j++) {
sb.append("0");
}
}
sb.append(s);
}
return sb.toString();
}
public static boolean isMark(String mar) {
if (!isIp(mar)) {
return false;
}
String[] arr = mar.split("\\.");
if (arr.length != 4) {
return false;
} else {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
try {
// 将子网掩码转为二进制字符串
String s = Integer.toString(Integer.parseInt(arr[i]), 2);
if (s.length() < 8) {
for (int j = 0; j + s.length() < 8; j++) {
sb.append("0");
}
}
sb.append(s);
} catch (Exception e) {
return false;
}
}
// 如果第一个0的位置在最后一个1的前面
if (sb.indexOf("0") < sb.lastIndexOf("1")) {
return false;
}
}
return true;
}
public static boolean isIp(String ip) {
String[] arr = ip.split("\\.");
if (arr.length != 4) {
return false;
} else {
for (int i = 0; i < 4; i++) {
try {
if (Integer.parseInt(arr[i]) < 0 || Integer.parseInt(arr[i]) > 255) {
return false;
}
} catch (Exception e) {
return false;
}
}
}
return true;
}
}


