美文网首页LeetCode笔记
LeetCode笔记:165. Compare Version

LeetCode笔记:165. Compare Version

作者: Cloudox_ | 来源:发表于2017-11-23 09:28 被阅读27次

    问题:

    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


    查看作者首页

    相关文章

      网友评论

        本文标题:LeetCode笔记:165. Compare Version

        本文链接:https://www.haomeiwen.com/subject/vniavxtx.html