题解 | #判断两个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); // 注意 hasNext 和 hasNextLine 的区别 while (sc.hasNext()) { //子网掩码 String mask = sc.nextLine(); //ip1 String ip1 = sc.nextLine(); //ip2 String ip2 = sc.nextLine(); int result = solution(mask, ip1, ip2); System.out.println(result); } } //判断两个ip是否属于一个子网 public static int solution(String mask, String ip1, String ip2) { //如果掩码不合法,返回1 if (maskIsInvaild(mask)) { return 1; } //如果ip不合法,返回1 if (ipIsInvaild(ip1) || ipIsInvaild(ip2)) { return 1; } String newMask = changeTo32(mask); String newIp1 = changeTo32(ip1); String newIp2 = changeTo32(ip2); //记录ip1与掩码与运算的结果 StringBuilder temp1 = new StringBuilder(); //记录ip2与掩码与运算的结果 StringBuilder temp2 = new StringBuilder(); //ip1与掩码进行与运算 for (int i = 0; i < newMask.length(); i++) { if (newMask.charAt(i) == '1' && newIp1.charAt(i) == '1') { temp1.append("1"); } else { temp1.append("0"); } } //ip2与掩码进行与运算 for (int i = 0; i < newMask.length(); i++) { if (newMask.charAt(i) == '1' && newIp2.charAt(i) == '1') { temp2.append("1"); } else { temp2.append("0"); } } //如果相等,则为同一子网,返回0,否则返回2 if (temp1.toString().equals(temp2.toString())) { return 0; } else { return 2; } } //判断子网掩码是否合法 public static boolean maskIsInvaild(String mask) { String[] maskArr = mask.split("\\."); //字段不为4,非法 if (maskArr.length != 4) { return true; } //不在0-255之间,非法 for (String s : maskArr) { if (Integer.parseInt(s) < 0 || Integer.parseInt(s) > 255) { return true; } } //不是连续的1和0,非法 // String newMask = toBinary(maskArr[0]) + toBinary(maskArr[1]) + toBinary( // maskArr[2]) + toBinary(maskArr[3]); String newMask = changeTo32(mask); if (!newMask.matches("[1]{1,}[0]{1,}")) { return true; } //默认合法 return false; } //判断ip是否合法 public static boolean ipIsInvaild(String ip) { String[] ipArr = ip.split("\\."); for (String s : ipArr) { if (Integer.parseInt(s) < 0 || Integer.parseInt(s) > 255) { return true; } } //默认合法 return false; } //转换为8位二进制数 public static String toBinary(String str) { String result = Integer.toBinaryString(Integer.parseInt(str)); //补足8位 while (result.length() < 8) { result = "0" + result; } return result; } //转换为32位进制数 public static String changeTo32(String str) { String[] arr = str.split("\\."); StringBuilder sb = new StringBuilder(); for (int i = 0; i < arr.length; i++) { String temp = Integer.toBinaryString(Integer.parseInt(arr[i])); //补足8位 while (temp.length() < 8) { temp = "0" + temp; } sb.append(temp); } return sb.toString(); } }