题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.math.*; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.stream.*; import java.util.regex.*; import java.util.function.*; import java.net.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextLine()) { String mask = in.nextLine(); String ip1 = in.nextLine(); String ip2 = in.nextLine(); if (!isMaskIleagl(mask) || !isIPIleagl(ip1) || !isIPIleagl(ip2)) { System.out.println(1); continue; } if (maskIP(mask, ip1).equals(maskIP(mask, ip2))) { System.out.println(0); } else { System.out.println(2); } } } static String maskIP(String mask, String ip) { List<String> list = new ArrayList<>(); String[] m = mask.split("\\."); String[] p = ip.split("\\."); for (int i = 0; i < 4; i++) { int and = Integer.parseInt(m[i]) & Integer.parseInt(p[i]); list.add(String.valueOf( and )); } return String.join(".", list); } static boolean isIPIleagl(String ip) { try { InetAddress address = InetAddress.getByName(ip); return address.getHostAddress().equals(ip); } catch (UnknownHostException e) { return false; } } static boolean isMaskIleagl(String mask) { if (!isIPIleagl(mask)) { return false; } String[] nums = mask.split("\\."); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { String bStr = Integer.toBinaryString(Integer.parseInt(nums[i])); // 技巧!! bStr = String.join("", Collections.nCopies(8 - bStr.length(), "0")) + bStr; sb.append(bStr); } // 符合先 1 后 0 boolean has0 = false; for (int i = 0; i < sb.length(); i++) { if ('0' == sb.charAt(i)) { has0 = true; } if (has0 && '1' == sb.charAt(i)) { return false; } } return true; } }