leetcode 165 比较版本号

题目

165. 比较版本号

给你两个版本号 version1version2 ,请你比较它们。

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

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

思路

需要解决的问题有

  • 版本号长度不同:短则补0
  • 每一位中的前导0(1.0001):转换为Number自动消去
  • 后置的0位(1.0.0.0):逐个比较,另一边短则补0

算法

.分割,从左到右逐个对比版本号

  • 预处理:
    • 版本号长度可能不一,缺则补0
    • 版本号从String格式转换为Number
  • 遍历数组,比较每一位版本号的大小
    • 大返回1
    • 小返回-1
    • 整个数组遍历完则表示相等,返回0

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @param {string} version1
* @param {string} version2
* @return {number}
*/
var compareVersion = function(version1, version2) {
const v1=version1.split('.')
const v2=version2.split('.')
const max=Math.max(v1.length,v2.length)
for (let i=0;i<max;i++){
let x=v1[i]? parseInt(v1[i]):0
let y=v2[i]? parseInt(v2[i]):0
if (x>y) return 1
if (x<y) return -1
}
return 0
};

细节:

  • Math.max单独计算,不要放在for循环里,不然每次循环都会执行
  • x=v1[i]? parseInt(v1[i]):0 也可以写成 ??空值合并 方式:Number(v[i]??0)
------ 本文结束 ❤ 感谢你的阅读 ------
------ 版权信息 ------

本文标题:leetcode 165 比较版本号

文章作者:Lury

发布时间:2022年04月06日 - 14:24

最后更新:2022年04月06日 - 15:20

原始链接:https://luryzhu.github.io/2022/04/06/leetcode/lc_versionCp/

许可协议:署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。