LeetCode笔记:165. Compare Version Numbers

问题:

Compare two version numbers version1 and version2.
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

大意:

比较两个版本号 version1 和 version2。
如果 version1 > version2 就返回 ,如果 version1 < version2 就返回 -1,否则返回0。
你可以假设版本字符串是非空的而且只包含数字和 “.” 字符。
“.”字符不表示小数点,是用来区分数字序号的。
比如说,2.5不是指超过2一半或者还有一半到版本3,而是第二个版本的第五次迭代。
这里是一个版本号顺序的例子:

0.1 < 1.1 < 1.2 < 13.37

思路:

比较版本号实在系统开发中经常用到的东西,题目中的例子给的其实有点不靠谱,版本号真正特殊的地方在于会存在多个小数点,也就是会有 1.3.2 这种版本号存在,真正要判断大小的也是这类版本。

我们首先把两个版本号字符串用 split 函数根据小数点分割成数组,注意要根据小数点区分不能直接只写小数点,还要用转义符,否则无法分割,具体看下面的代码。

然后依次比较每位数字的大小,只要出现同一个位置上某一方更大,就可以直接返回结果了。需要注意的是不能直接比较字符串,需要转成int去比较,因为题目会给出“000”这种多个0的情况,字符串直接比较不了,转成int后就都是0了。

当某个版本号的数字全部比较完后,看看另一个版本号还有没有内容,有的话也不能急着判断是另一个大,因为存在 1.0 这种情况,它和 1 是一样大的,就是多一位0,那是不是只用判断下一位是不是0呢,也不是,还有 1.0.1 的情况,它就比 1 大。所以,当某个版本号还有剩余的时候,我们要看看剩余的部分有没有不是0的部分,这里同样必须转成int去和0比较,字符串无法全部囊括。

自己测试下面几个用例就差不多了:

  • 1.1 和 1.2
  • 1 和 1.0
  • 1 和 1.0.1
  • 1.00.0 和 1.0
  • 1 和 1.00

代码(Java):

public class Solution {
    public int compareVersion(String version1, String version2) {
        String[] arr1 = version1.split("\\.");
        String[] arr2 = version2.split("\\.");
        // System.out.println(arr1.length + " " + arr2.length);
        int i = 0;
        while (i < arr1.length && i < arr2.length) {
            // System.out.println(arr1[i] + " " + arr2[i]);
            int a = Integer.valueOf(arr1[i]).intValue();
            int b = Integer.valueOf(arr2[i]).intValue();
            if (a > b) return 1;
            else if (a < b) return -1;
            
            i++;
        }
        if (i < arr1.length) {
            while (i < arr1.length) {
                int version = Integer.valueOf(arr1[i]).intValue();
                if (version != 0) return 1;
                i++;
            }
            return 0;
        } 
        else if ( i < arr2.length) {
            while (i < arr2.length) {
                int version = Integer.valueOf(arr2[i]).intValue();
                if (version != 0) return -1;
                i++;
            }
            return 0;
        }
        else return 0;
    }
}

合集:https://github.com/Cloudox/LeetCode-Record


查看作者首页

推荐阅读更多精彩内容