题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
都转为32位的二进制后,如果子网掩码的1有n位,那么ip1和ip2的前n位必须相同,他们才是统一子网。
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()) { // 注意 while 处理多个 case String mar = in.next(); String ip1 = in.next(); String ip2 = in.next(); if (!(isMark(mar) && isIp(ip1) && isIp(ip2))) { System.out.println(1); continue; } String sMark = ipToString(mar); // 找到0的位置,这个位置之前的二进制必须相同才属于同一网络 int index = sMark.indexOf("0"); String sIp1 = ipToString(ip1); String sIp2 = ipToString(ip2); if(sIp1.substring(0,index).equals(sIp2.substring(0,index))){ System.out.println(0); }else{ System.out.println(2); } } } // 将ip地址转为32位二进制 public static String ipToString(String ip) { String[] arr = ip.split("\\."); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { // 将子网掩码转为二进制字符串 String s = Integer.toString(Integer.parseInt(arr[i]), 2); if (s.length() < 8) { for (int j = 0; j + s.length() < 8; j++) { sb.append("0"); } } sb.append(s); } return sb.toString(); } public static boolean isMark(String mar) { if (!isIp(mar)) { return false; } String[] arr = mar.split("\\."); if (arr.length != 4) { return false; } else { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { try { // 将子网掩码转为二进制字符串 String s = Integer.toString(Integer.parseInt(arr[i]), 2); if (s.length() < 8) { for (int j = 0; j + s.length() < 8; j++) { sb.append("0"); } } sb.append(s); } catch (Exception e) { return false; } } // 如果第一个0的位置在最后一个1的前面 if (sb.indexOf("0") < sb.lastIndexOf("1")) { return false; } } return true; } public static boolean isIp(String ip) { String[] arr = ip.split("\\."); if (arr.length != 4) { return false; } else { for (int i = 0; i < 4; i++) { try { if (Integer.parseInt(arr[i]) < 0 || Integer.parseInt(arr[i]) > 255) { return false; } } catch (Exception e) { return false; } } } return true; } }