题解 | #判断两个IP是否属于同一子网#

判断两个IP是否属于同一子网

https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218

Java-字符串与数字之间的转换和校验

  • 展开分享之前,先写下一些做题的回顾事项

    • 首先,就是关于regex的使用问题,分割如果需要使用到"."那么需要进行转义,如果在字符串中要将具有特殊含义的字符"\"转化为普通的字符,还需要将"\"进行转义,那么最后分割ip地址的regex为 " \\."(打出这个\,甚至还需要再markdown中转义,其实我敲了四个\,看来这个符号在各种字符使用标准中应用广泛啊(Φ皿Φ))
    • 其次,就是回顾一下位运算,这里就记录一下之后复习(数据之间可以直接使用&运算符号进行位运算🐷)
    • 最后就是对字符串判别等于的方式了,这里我需要判断最后的两个StringBuilder中的值是否相等,于是将StringBuilder转化为了String,本来以为可以直接==判断,结果还是得equels判断,有点不明白^(* ̄(oo) ̄)^。

    主要步骤

    1. 检查掩码和IP的合法性,这里对掩码的检查时,代码比较繁杂,希望大佬指正┭┮﹏┭┮
    2. 计算每个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取模和取整,但是感觉直接和常数比较也方便,看数据量怎么样。
    • 还有很多可以优化的地方,望指正🙇‍
全部评论

相关推荐

04-28 19:31
门头沟学院 Java
真烦好烦真烦:可恶的二手车贩子,居然对我们门头沟学院的人这么没礼貌
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客企业服务