题解 | Java版 又臭又长的题解(性能还低)
判断两个IP是否属于同一子网
http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.util.*;
public class Main{
private static int[] help = new int[]{0,1,2};
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNextLine()){
//防止没有输入三个数
String maskIP = in.nextLine();
if(maskIP.length() == 0) break;
String ip01 = in.nextLine();
if(ip01.length() == 0) break;
String ip02 = in.nextLine();
if(ip02.length() == 0) break;
//判断子网掩码是否合法
boolean maskFlag = judgeMaskIP(maskIP);
if(!maskFlag){
System.out.println(help[1]);
continue;
}
boolean ip01Flag = judgeIpLegal(ip01);
if(!ip01Flag){
System.out.println(help[1]);
continue;
}
boolean ip02Flag = judgeIpLegal(ip02);
if(!ip02Flag){
System.out.println(help[1]);
continue;
}
//判断是不是在一个网段
long maskTest = stringToNum(maskIP);
long ip01Test = stringToNum(ip01);
long ip02Test = stringToNum(ip02);
if((maskTest & ip01Test) == (maskTest & ip02Test)){
System.out.println(help[0]);
}else{
System.out.println(help[2]);
}
}
}
//判断ip是否合法
public static boolean judgeIpLegal(String ip){
boolean flag = true;
String[] ipTemp = ip.split("\\.");
if(ipTemp.length != 4) {
flag = false;
return flag;
}
for(int i = 0; i < ipTemp.length; i++){
long tempNum = Long.parseLong(ipTemp[i]);
if(!(tempNum >= 0 && tempNum <= 255)){
flag = false;
return flag;
}
}
return flag;
}
//判断子网掩码是否合法 【0.0.0.0】和【255.255.255.255】也不算
//掩码中间的1中如果插入了0页不是子网掩码, eg 【255.234.255.0】
public static boolean judgeMaskIP(String maskIP){
String[] maskString = maskIP.split("\\.");
if(maskString.length != 4) return false;
long maskTemp = arraysToNum(maskString);
if(maskTemp <= 0 || maskTemp >=0XFFFFFFFFL || (((maskTemp ^ 0XFFFFFFFFL) + 1) | maskTemp)!= maskTemp){
return false;
}
return true;
}
//数组转Long
public static Long arraysToNum(String[] str){
long resultNum = 0L;
for(int i = 0; i < str.length; i++){
resultNum = (resultNum << 8) + Long.parseLong(str[i]);
}
return resultNum;
}
//String转Long
public static Long stringToNum(String strIP){
String[] tempString = strIP.split("\\.");
long resultNum = arraysToNum(tempString);
return resultNum;
}
}