题解 | #判断两个IP是否属于同一子网# 细节太多了。。
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String mask = sc.nextLine();
String ip1 = sc.nextLine();
String ip2 = sc.nextLine();
boolean isMask = Main.isCorrectNet(mask);
boolean maskRes = Main.isMaskCode(mask);
boolean ip1Res = Main.isCorrectNet(ip1);
boolean ip2Res = Main.isCorrectNet(ip2);
if (isMask&& maskRes && ip1Res && ip2Res){
System.out.println(Main.isSameNetwork(ip1, ip2, mask));
}else{
System.out.println("1");
}
}
/**
* 子网掩码判断
* @param net
* @return
*/
public static boolean isMaskCode(String net){
String[] split = net.split("\\.");
StringBuffer completedSb = new StringBuffer();
for (String s : split) {
long speratedIp = Long.parseLong(s);
if (speratedIp != 0){
String sb = Long.toBinaryString(speratedIp);
completedSb.append(Main.autoComplete(sb.toString(), "0", 8));
}else{
completedSb.append("00000000");
}
}
String zeroPart = completedSb.substring(completedSb.indexOf("0"));
if (zeroPart.contains("1")){
// 掩码格式错误
return false;
}else {
return true;
}
}
/**
* ip判断
* @param ip
* @return
*/
public static boolean isCorrectNet(String ip){
String[] splitIp = ip.split("\\.");
for (String s : splitIp) {
if (Integer.parseInt(s)>255 || Integer.parseInt(s)<0){
return false;
}
}
return true;
}
/**
* 判断是否属于同一个子网
* @param ip1
* @param ip2
* @param subNet
* @return
*/
public static String isSameNetwork(String ip1, String ip2, String subNet){
//子网掩码长度
String[] split = subNet.split("\\.");
StringBuffer sb = new StringBuffer();
for (String s : split) {
long speratedIp = Long.parseLong(s);
sb.append(Long.toBinaryString(speratedIp));
}
int subNetIndex = sb.indexOf("0");
//解析ip1
String[] split1 = ip1.split("\\.");
String ip1Sb = "";
StringBuffer completedSb1 = new StringBuffer();
for (String s : split1) {
long speratedIp1 = Long.parseLong(s);
ip1Sb = Long.toBinaryString(speratedIp1);
completedSb1.append(Main.autoComplete(ip1Sb, "0", 8));
}
String subIp1 = completedSb1.substring(0, subNetIndex - 1);
//解析ip2
String[] split2 = ip2.split("\\.");
String ip2Sb = "";
StringBuffer completedSb2 = new StringBuffer();
for (String s : split2) {
long speratedIp2 = Long.parseLong(s);
ip2Sb = Long.toBinaryString(speratedIp2);
completedSb2.append(Main.autoComplete(ip2Sb, "0", 8));
}
String subIp2 = completedSb2.substring(0, subNetIndex - 1);
if (subIp2.equals(subIp1)){
return "0";
}else {
return "2";
}
}
public static String autoComplete(String str, String symbol, int fixedLen){
int strLen = str.length();
int neededLen = fixedLen - strLen;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < neededLen; i++) {
sb.append(symbol);
}
return sb+str;
}
}