题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.util.Scanner;
import java.util.regex.Pattern;
// 注意类名必须为 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 mastStr = in.next();
String ip1 = in.next();
String ip2 = in.next();
if (!chekIp(ip1) || !chekIp(ip2)) { // ip不合法
System.out.println(1);
continue;
}
if (!chekMast(mastStr)) { // 子网掩码非法
System.out.println(1);
continue;
}
//判断是否属于同一子网络
if (chekEqual(ip1, ip2, mastStr)) {
System.out.println(0);
} else {
System.out.println(2);
}
}
}
// 校验ip
private static boolean chekIp(String ip) {
// ip的每一段都在 0 -255 之间
String[] ipArr = ip.split("\\.");
if (ipArr.length != 4) {
return false;
}
Pattern p = Pattern.compile("[0-9]");
for (int i = 0; i < ipArr.length ; i++) {
if (p.matcher(ipArr[i]).find()) { // 校验位数字
Integer d = Integer.valueOf(ipArr[i]);
if (d > 255 || d < 0) {
return false;
}
} else {
return false;
}
}
return true;
}
// 校验子网掩码
private static boolean chekMast(String mast) {
String[] mastArr = mast.split("\\.");
if (mastArr.length != 4) {
return false;
}
StringBuilder sb = new StringBuilder();
Pattern p = Pattern.compile("[0-9]");
for (int i = 0; i < mastArr.length ; i++) {
if (p.matcher(mastArr[i]).find()) { // 校验位数字
Integer d = Integer.valueOf(mastArr[i]);
if(d > 255 || d < 0){
return false;
}
sb.append(getBinaryString(mastArr[i]));
} else {
return false;
}
}
return sb.toString().contains("1") && sb.toString().contains("0") &&
!sb.toString().contains("01");
}
private static String getBinaryString(String str) {
String bin = Integer.toBinaryString(Integer.valueOf(str));
while ( bin.length() < 8) {
bin = "0".concat(bin);
}
return bin;
}
private static boolean chekEqual(String ip1, String ip2, String mast) {
String[] ipArr1 = ip1.split("\\.");
String[] ipArr2 = ip2.split("\\.");
String[] mastArr = mast.split("\\.");
StringBuilder ip1Sb = new StringBuilder();
StringBuilder ip2Sb = new StringBuilder();
StringBuilder mastSb = new StringBuilder();
for (int i = 0; i < ipArr1.length ; i++) {
ip1Sb.append( getBinaryString(ipArr1[i]) );
ip2Sb.append( getBinaryString(ipArr2[i]) );
mastSb.append( getBinaryString(mastArr[i]) );
}
StringBuilder ip1Result = new StringBuilder();
StringBuilder ip2Result = new StringBuilder();
char[] ip1char = ip1Sb.toString().toCharArray();
char[] ip2char = ip2Sb.toString().toCharArray();
char[] mastchar = mastSb.toString().toCharArray();
for (int i = 0; i < ipArr1.length ; i++) {
if (ip1char[i] == '1' && mastchar[i] == '1' ) {
ip1Result.append('1');
} else {
ip1Result.append('0');
}
if (ip2char[i] == '1' && mastchar[i] == '1' ) {
ip2Result.append('1');
} else {
ip2Result.append('0');
}
}
if (ip1Result.toString().equals(ip2Result.toString())) {
return true;
} else {
return false;
}
}
}


SHEIN希音公司福利 278人发布