LeetCode-165-比较版本号
in LeetCode with 0 comment

LeetCode-165-比较版本号

in LeetCode with 0 comment

原题地址:比较版本号

比较两个版本号 version1 和 version2。
如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0

你可以假设版本字符串非空,并且只包含数字和 . 字符。

 . 字符不代表小数点,而是用于分隔数字序列。

例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。

你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版本)修订号分别为 34。其第三级和第四级修订号均为 0
 
示例 1:

输入: version1 = "0.1", version2 = "1.1"
输出: -1

示例 2:

输入: version1 = "1.0.1", version2 = "1"
输出: 1

示例 3:

输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1

示例 4:

输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。

示例 5:

输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。

 
提示:

  1. 版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。
  2. 版本字符串不以点开始或结束,并且其中不会有两个连续的点。

常规方法

根据版本号的比较规则,将版本字符串,以点(.)为依据拆分为数组,然后从前往后对数组中的每个元素依次对比,直到找出第一个不同的元素或元素全部对比完成为止。

具体实现方法如下:

/**
 * @param {string} version1
 * @param {string} version2
 * @return {number}
 */
const compareVersion1 = function(version1, version2) {
    // 将字符串分别拆解为数组
    let [array1, array2] = [version1.split('.'), version2.split('.')];
    // 找出两个数组中较长的一个的长度
    let length = Math.max(array1.length, array2.length);
    // 对两个数组从前往后一一对比
    for (let i = 0; i < length; i ++) {
        // 转换为数字,不存在时当0看待
        let [number1, number2] = [Number(array1[i]) || 0, Number(array2[i]) || 0];
        if (number1 > number2) {
            return 1;
        }
        if (number1 < number2) {
            return -1;
        }
    }
    return 0;
};

测试:

let start = new Date();
const test = compareVersion1;
console.log(test('0.1','1.1')); // -1
console.log(test('1.0.1','1')); // 1
console.log(test('7.5.2.4','7.5.3')); // -1
console.log(test('1.01','1.001')); // 0
console.log(test('1.0','1.0.0')); // 0
console.log(new Date().getTime() - start.getTime()); // 6

时间复杂度: 拆分为数组后需要对数组的每个元素依次比较,时间复杂度为$O(N)$,N为拆分后较长的一个数组的长度
空间复杂度: 需要额外的两个数组来存储拆分后的数字,空间复杂度为$O(2N)$=$O(N)$