原题地址:比较版本号
比较两个版本号 version1 和 version2。
如果 version1 > version2
返回 1
,如果 version1 < version2
返回 -1
, 除此之外返回 0
。
你可以假设版本字符串非空,并且只包含数字和 .
字符。
.
字符不代表小数点,而是用于分隔数字序列。
例如,2.5
不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。
你可以假设版本号的每一级的默认修订版号为 0
。例如,版本号 3.4
的第一级(大版本)和第二级(小版本)修订号分别为 3
和 4
。其第三级和第四级修订号均为 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”。
提示:
- 版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。
- 版本字符串不以点开始或结束,并且其中不会有两个连续的点。
常规方法
根据版本号的比较规则,将版本字符串,以点(.)为依据拆分为数组,然后从前往后对数组中的每个元素依次对比,直到找出第一个不同的元素或元素全部对比完成为止。
具体实现方法如下:
/**
* @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)$
本文由 李海平 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Aug 5,2020