题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
http://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.hasNext()) {
//输入子网掩码
String a = in.next();
//输入IP1
String b = in.next();
//输入IP2
String c = in.next();
System.out.println(myAns(a,b,c));
}
}
private static Integer myAns(String mask , String ip1 , String ip2) {
if (!(checkLegal(mask,true) && checkLegal(ip1,false) && checkLegal(ip2,false) ) ) {
return 1;
}
if (andOperation(mask,ip1,ip2)) {
return 0;
}
return 2;
}
//检查ip和子网掩码是否合法
private static Boolean checkLegal(String ip, Boolean bool) {
String [] strs = ip.trim().split("\\.");
if(strs.length != 4) {//号段个数验证
return false;
}
for (int i = 0 ; i < 4 ; i++) {
int n;
if (i == 0 && bool) {//验证子网掩码网络号-前缀
n = Integer.valueOf(strs[i]);
if (n != 255) {
return false;
}
} else if (i == 3 && bool) {//验证子网掩码网络号-后缀
n = Integer.valueOf(strs[i]);
if (n != 0) {
return false;
}
} else {
n = Integer.valueOf(strs[i]);
if (n < 0 || n > 255) {
return false;
}
}
}
return true;
}
//于子网掩码做与运算
private static boolean andOperation(String mask,String ip1,String ip2) {
String [] masks = mask.trim().split("\\.");
String [] ip1s = ip1.trim().split("\\.");
String [] ip2s = ip2.trim().split("\\.");
for (int i = 0; i < 4; i++) {
int m = Integer.valueOf(masks[i]);
int p1 = Integer.valueOf(ip1s[i]);
int p2 = Integer.valueOf(ip2s[i]);
if ((p1 & m) != (p2 & m) ) {
return false;
}
}
return true;
}
}