算法:比较版本号

2,682 阅读1分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

Hope is a good thing, maybe the best of things. And no good thing ever dies.

题目

版本号由一个或多个修订号组成,各修订号由一个 . 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.330.1 都是有效的版本号。

返回规则如下:

如果 version1 > version2 返回 1, 如果 version1 < version2 返回 -1, 除此之外返回 0

示例 1:
输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,"01" 和 "001" 都表示相同的整数 "1"
示例 2:

输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有指定下标为 2 的修订号,即视为 "0"
示例 3:

输入:version1 = "0.1", version2 = "1.1"
输出:-1
解释:version1 中下标为 0 的修订号是 "0",version2 中下标为 0 的修订号是 "1" 。0 < 1,所以 version1 < version2
示例 4:

输入:version1 = "1.0.1", version2 = "1"
输出:1
示例 5:

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

思路分析

比较版本号时,按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修订号 001 相等 。如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 010 < 1

解题

/**
 * @param {string} version1
 * @param {string} version2
 * @return {number}
 */
var compareVersion = function(version1, version2) {
    // 将两个版本号切割成由修订号组成的数组
    const arr1 = version1.split('.')
    const arr2 = version2.split('.')
    // 比较两个数组的长度,得到最大的数组长度
    const maxLength = Math.max(arr1.length, arr2.length);

    // 遍历数组,分别比较同一个位置上的版本号
    for(let i = 0; i<maxLength; i++) {
        // 从左到右依次比较版本号
        const a = arr1[i] || 0;
        const b = arr2[i] || 0;
        //  忽略前导0,使用Number()转为数字
        if(Number(a) > Number(b)) {
            return 1
        } else if (Number(a) < Number(b)) {
            return -1
        }

        // 对比结束的时候,就返回 0
        if(i === maxLength - 1) {
            return 0
        }
    }
};

执行结果

image.png

image.png

附:leetcode-cn.com/problems/co…

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏

欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后