zoukankan      html  css  js  c++  java
  • Leetcode: Compare Version Numbers

    Compare two version numbers version1 and version1.
    If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0.
    
    You may assume that the version strings are non-empty and contain only digits and the . character.
    The . character does not represent a decimal point and is used to separate number sequences.
    For instance, 2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.
    
    Here is an example of version numbers ordering:
    
    0.1 < 1.1 < 1.2 < 13.37

    这道题的意思用一个例子说明就是1.2 < 1.10, 因为1.10跟1.1是不一样的,1.10代表tenth revision. 而1.1代表first revision。所以这道题要按“.”分段,然后分段比较,方法是用split函数把string 分段,每一段挨个比过去。这里参考了网上的一个小技巧:

    由于两串字符串并不是一样长度的,如果分情况比较,如第一个长,遍历逐一比较则要分情况讨论。此时就采取一些小技巧,将两个字符串对齐,就无需考虑各种情况,超出的位数补0即可,这是一种字符串、数串比较的小技巧。比如比较 1 和 1.0

    所以这里取了两个string长度的最大值 maxLen, 来建立两个数组来存split“.”之后分出来的数字,短的那个数组末尾默认补0. 然后从左到右挨个比过去

    Integer.parseInt()函数能将“012”转化为12,解决了首位为0的问题

    另外用split函数有一点特别要注意:我们知道,“ . ”在正则表达式中有特殊的含义,因此我们使用的时候必须进行转义。

    不转义就会有如下结果:

    String ipstring="59.64.159.224";  

    String iparray[]=ipstring.split(".");  

    for(String stemp:iparray){  

    System.out.println(stemp);  

    }  

    这个输出为空,为什么呢?  

    public string[] split(string regex) 这里的参数的名称是regex ,也就是 regular expression (正则表达式)。

    “ . ”在正则表达式中有特殊的含义,表示means "any character" in regex

    所以如果就想表示一个点的话,use either split("\.") or split(Pattern.quote(".")).

     1 public class Solution {
     2     public int compareVersion(String version1, String version2) {
     3         String[] strs1 = version1.split("\.");
     4         String[] strs2 = version2.split("\.");
     5         int maxLen = Math.max(strs1.length, strs2.length);
     6         int[] nums1 = new int[maxLen];
     7         int[] nums2 = new int[maxLen];
     8         for (int i=0; i<strs1.length; i++) {
     9             nums1[i] = Integer.parseInt(strs1[i]);
    10         }
    11         for (int i=0; i<strs2.length; i++) {
    12             nums2[i] = Integer.parseInt(strs2[i]);
    13         }
    14         for (int i=0; i<maxLen; i++) {
    15             if (nums1[i] > nums2[i]) return 1;
    16             else if (nums1[i] < nums2[i]) return -1;
    17         }
    18         return 0;
    19     }
    20 }

    Improve a lit bit by using less memory

     1 public int compareVersion(String version1, String version2) {
     2     String[] levels1 = version1.split("\.");
     3     String[] levels2 = version2.split("\.");
     4     
     5     int length = Math.max(levels1.length, levels2.length);
     6     for (int i=0; i<length; i++) {
     7         Integer v1 = i < levels1.length ? Integer.parseInt(levels1[i]) : 0;
     8         Integer v2 = i < levels2.length ? Integer.parseInt(levels2[i]) : 0;
     9         int compare = v1.compareTo(v2);
    10         if (compare != 0) {
    11             return compare;
    12         }
    13     }
    14     
    15     return 0;
    16 }
  • 相关阅读:
    HTML5 拖放(Drag 和 Drop)详解与实例
    JS中的六大数据类型
    关于创建本地docker仓库
    关于使用国内dock仓库,网易、DaoCloud
    关于Docker开通远程访问端口2375
    多个消费者监听同一个队列
    SQLite -附加数据库
    解密JDK8 枚举
    LoraLU
    深入理解display属性
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/4251818.html
Copyright © 2011-2022 走看看