题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
Java-字符串与数字之间的转换和校验
展开分享之前,先写下一些做题的回顾事项
- 首先,就是关于regex的使用问题,分割如果需要使用到"."那么需要进行转义,如果在字符串中要将具有特殊含义的字符"\"转化为普通的字符,还需要将"\"进行转义,那么最后分割ip地址的regex为 " \\."(打出这个\,甚至还需要再markdown中转义,其实我敲了四个\,看来这个符号在各种字符使用标准中应用广泛啊(Φ皿Φ))
- 其次,就是回顾一下位运算,这里就记录一下之后复习(数据之间可以直接使用&运算符号进行位运算🐷)
- 最后就是对字符串判别等于的方式了,这里我需要判断最后的两个StringBuilder中的值是否相等,于是将StringBuilder转化为了String,本来以为可以直接==判断,结果还是得equels判断,有点不明白^(* ̄(oo) ̄)^。
主要步骤
- 检查掩码和IP的合法性,这里对掩码的检查时,代码比较繁杂,希望大佬指正┭┮﹏┭┮
- 计算每个IP的子网,直接使用的&位运算
代码
import java.util.Scanner; public class Main { public static void main(String[] args) { // 获取输入的三行数据 Scanner scanner = new Scanner(System.in); String[] mask = scanner.nextLine().split("\\."); String[] ip1 = scanner.nextLine().split("\\."); String[] ip2 = scanner.nextLine().split("\\."); // 开始判断是否合法 for(int i=0;i<4;i++){ if(Integer.parseInt(ip1[i])<0 || Integer.parseInt(ip1[i])>255 || Integer.parseInt(ip2[i])<0 || Integer.parseInt(ip2[i])>255) { System.out.println(1); return; } } int flag=0; // 判断mask是否合法 for(int i=0;i<4;i++){ int n = Integer.parseInt(mask[i]); if(n!=0 && n!=255 && n!=254 && n!=252 && n!=248 && n!= 240 && n!=224 && n!=192 && n!=128 ){ System.out.println(1); return; } if(flag == 0){ // 当都为255 if(n!=255) flag=1; continue; }else if(n!=0){ System.out.println(1); return; } } // 开始进行位运算 StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); for(int i=0;i<4;i++){ int n1 = Integer.parseInt(ip1[i]); int n2 = Integer.parseInt(ip2[i]); int m = Integer.parseInt(mask[i]); sb1.append((n1&m)+"."); sb2.append((n2&m)+"."); } String s1 = sb1.toString(); String s2 = sb2.toString(); if(s1.equals(s2)) { System.out.println(0); return; } System.out.println(2); return; } }
代码优化
- 首先,可以将一些判定的代码写为一个单独的函数,在ACM中可以定义一个静态函数给main函数使用,之前也有看到官方的创建一个内部静态类Solution在其中增加辅助代码,但感觉有点麻烦
- 对掩码的合法性判断,之前用过对掩码从小到大遍历每一个二进制位,具体方法就是不断对2取模和取整,但是感觉直接和常数比较也方便,看数据量怎么样。
- 还有很多可以优化的地方,望指正🙇