【面试-leetcode165】比较版本号(分割字符串+双指针)

56 阅读1分钟

freysteinn-g-jonsson-s94zCnADcUs-unsplash.jpg 这是 leetcode 面试刷题一题多解系列的第15篇,比较版本号。

题目

比较版本号

来源:力扣(LeetCode) 链接:leetcode.cn/problems/co…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:分割字符串+循环比较

我们可以将版本号分割成数组,然后将每个修订号转换为数字,并按顺序进行比较。如果某个版本号中没有更多的修订号,则将其余修订号视为 0 。

时间复杂度:O(n),其中 n 是较长的版本字符串的长度。具体地,分割字符串的时间复杂度为 O(n),比较修订号的时间复杂度为 O(max(m1,m2)),其中 m1和m2分别是两个版本号中的修订号数量。

空间复杂度:O(n),其中 n 是较长的版本字符串的长度。具体地,存储版本字符串的数组的空间复杂度为 O(n)。

var compareVersion = function(version1, version2) {
    let v1 = version1.split('.');
    let v2 = version2.split('.');
    const len = Math.max(v1.length, v2.length);
    for (let i = 0; i < len; i++) {
        let num1 = i < v1.length ? parseInt(v1[i]) : 0;
        let num2 = i < v2.length ? parseInt(v2[i]) : 0;
        if (num1 > num2) {
            return 1;
        } else if (num1 < num2) {
            return -1;
        }
    }
    return 0;
};

解法二: 双指针

首先将两个版本号按照点号分割成数组形式,然后分别对应位置的数字进行比较。在比较时,用两个指针分别指向两个版本号的相同位置,然后依次比较两个指针所指的数字大小。如果相同,则继续往后比较,直到比较出大小不同的位置或者其中一个版本号已经比较完毕。如果其中一个版本号已经比较完毕,则另一个版本号剩下的部分必须全部为 0 才能视为相等。

时间复杂度: O(n)

空间复杂度: O(n),其中 n 为两个版本号中较长的那个字符串的长度。

var compareVersion = function(version1, version2) {
    const v1Arr = version1.split(".");
    const v2Arr = version2.split(".");
    const len = Math.max(v1Arr.length, v2Arr.length);
    for (let i = 0; i < len; i++) {
        let v1 = i < v1Arr.length ? parseInt(v1Arr[i]) : 0;
        let v2 = i < v2Arr.length ? parseInt(v2Arr[i]) : 0;
        if (v1 > v2) {
            return 1;
        } else if (v1 < v2) {
            return -1;
        }
    }
    return 0;
};

我的更多前端资讯

欢迎大家技术交流 资料分享 摸鱼 求助皆可 —链接