题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.util.*; // 注意类名必须为 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 mask = in.next(); String ip1 = in.next(); String ip2 = in.next(); //判断掩码 boolean checkMask = maskCheck(mask); //检查ip boolean checkIp1 = ipCheck(ip1); boolean checkIp2 = ipCheck(ip2); boolean checkResult = checkIp1 && checkIp2 && checkMask; if (checkResult) { //转二进制 String mb = toBinary(mask); String b1 = toBinary(ip1); String b2 = toBinary(ip2); //ip和掩码与运算 int same = 0; for (int i = 0; i < 32; i++) { char m = mb.charAt(i); char c1 = b1.charAt(i); char c2 = b2.charAt(i); char compute1 = 'a'; char compute2 = 'a'; if (m == '1' && c1 == '1') { compute1 = '1'; } else { compute1 = '0'; } if (m == '1' && c2 == '1') { compute2 = '1'; } else { compute2 = '0'; } //是否同一子网判断 if (compute1 != compute2) { same++; break; } } if (same == 0) { System.out.println(0); } else { System.out.println(2); } } else { System.out.println(1); } } } public static boolean maskCheck(String mask) { String[] facs = mask.split("\\."); if (facs.length != 4) { return false; } else { //检查值的范围 String binaryIp = ""; for (int i = 0; i < 4; i++) { String temp = facs[i]; int value = Integer.parseInt(temp); if (value < 0 || value > 255) { return false; } else { //转二进制 String b = Integer.toBinaryString(value); if (b.length() < 8) { for (int j = 0; j < 8 - b.length(); j++) { b = "0" + b; } } binaryIp += b; } } //检查掩码的0和1位置 int start = 0; for (int i = 0; i < binaryIp.length(); i++) { //找到第一个不是1的位置 if (binaryIp.charAt(i) != '1' && start == 0) { start = i - 1; } } for (int i = 0; i <= start; i++) { if (binaryIp.charAt(i) != '1') { return false; } } for (int i = start + 1; i < binaryIp.length(); i++) { if (binaryIp.charAt(i) != '0') { return false; } } } return true; } public static boolean ipCheck(String ip) { //长度检查 String[] facs = ip.split("\\."); if (facs.length != 4) { return false; } else { //检查值的范围 for (int i = 0; i < 4; i++) { String temp = facs[i]; int value = Integer.parseInt(temp); if (value < 0 || value > 255) { return false; } } } return true; } public static String toBinary(String str) { //长度检查 String binaryIp = ""; String[] facs = str.split("\\."); for (int i = 0; i < 4; i++) { String temp = facs[i]; int value = Integer.parseInt(temp); //转二进制 String b = Integer.toBinaryString(value); //不足8位补0 int length=b.length(); if (length< 8) { for (int j = 0; j < 8 - length; j++) { b = "0" + b; } } binaryIp += b; } return binaryIp; } }
耗时约55min。。。。。。