题解 | #判断两个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; } }