比较版本号

22e83ac11a5e487619f7e97684433ed1.png

版本号的的比较顺序应该是从大版本往小版本开始对比,每个版本之间用.隔开。因此我们可以将两个版本字符串以.分隔开,从第一个版本号开始往下对比,若遇到version1的当前版本号大于version2,则返回1,否则返回-1。若一方的小版本号为空,则看另外一方的小版本号是否不为0。

根据上面的思路有两种做法,一种是用JavaScript自带的Array.split()函数,将其以.分割成数组。另一种是不使用数组,用双指针去指向当前版本号所在的位置。

示例:


输入:version1 = "1.2", version2 = "1.10"


输出:-1


解释:version1 的第二个修订号为 "2",version2 的第二个修订号为 "10":2 < 10,所以 version1 < version2。

单指针双数组

var compareVersion = function(version1, version2) {
    const arrayA = version1.split('.');
    const arrayB = version2.split('.');


    let pointer = 0;
    while (pointer < arrayA.length && pointer < arrayB.length) {
        const res = arrayA[pointer] - arrayB[pointer];
        if (res === 0) {
            pointer++;
        } else {
            return res > 0 ? 1 : -1;
        }
    }
    // 若arrayA仍有小版本号
    while (pointer < arrayA.length) {
        if (+arrayA[pointer] > 0) {
            return 1;
        } else {
            pointer++;
        }
    }
    // 若arrayB仍有小版本号
    while (pointer < arrayB.length) {
        if (+arrayB[pointer] > 0) {
            return -1;
        } else {
            pointer++;
        }
    }
    // 版本号完全相同
    return 0;
};

双指针

var compareVersion = function(version1, version2) {
    let pA = 0, pB = 0;
    /** 寻找当前区间的版本号 */
    const findDigit = (str, start) => {
        let i = start;
        while (str[i] !== '.' && i < str.length) {
            i++;
        }
        return i;
    }


    while (pA < version1.length && pB < version2.length) {
        const nextA = findDigit(version1, pA);
        const nextB = findDigit(version2, pB);
        const numA = +version1.substr(pA, nextA - pA);
        const numB = +version2.substr(pB, nextB - pB);
        if (numA !== numB) {
            return numA > numB ? 1 : -1;
        }
        pA = nextA + 1;
        pB = nextB + 1;
    }
    // 若arrayA仍有小版本号
    while (pA < version1.length) {
        const nextA = findDigit(version1, pA);
        const numA = +version1.substr(pA, nextA - pA);
        if (numA > 0) {
            return 1;
        }
        pA = nextA + 1;
    }
    // 若arrayB仍有小版本号
    while (pB < version2.length) {
        const nextB = findDigit(version2, pB);
        const numB = +version2.substr(pB, nextB - pB);
        if (numB > 0) {
            return -1;
        }
        pB = nextB + 1;
    }
    // 版本号完全相同
    return 0;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值