LeetCode 「中等」165.比较版本号
题目描述
给你两个版本号字符串 version1 和 version2,请你比较它们。版本号由被点 '.' 分开的修订号组成。修订号的值是它转换为整数并忽略前导零。
比较版本号时,请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较少,则将缺失的修订号视为 0。
返回规则如下:
如果 version1 < version2 返回 -1, 如果 version1 > version2 返回 1, 除此之外返回 0。
示例
输入:version1 = "1.2", version2 = "1.10"
输出:-1
输入:version1 = "1.01", version2 = "1.001"
输出:0
输入:version1 = "1.0", version2 = "1.0.0.0"
输出:0
解答
字符串分割
Code
/**
* @param {string} version1
* @param {string} version2
* @return {number}
*/
var compareVersion = function(version1, version2) {
const verArr1 = version1.split('.');
const verArr2 = version2.split('.');
const verLen = Math.max(verArr1.length, verArr2.length);
for (let i = 0; i < verLen; ++i) {
if ((verArr1[i] * 1 || 0) > (verArr2[i] * 1 || 0)) {
return 1;
} else if ((verArr1[i] * 1 || 0) < (verArr2[i] * 1 || 0)) {
return -1;
} else if (i >= verLen - 1) {
return 0;
}
}
};
双指针
方法一需要存储分割后的修订号,为了优化空间复杂度,我们可以在分割版本号的同时解析出修订号进行比较。
Code
var compareVersion = function(version1, version2) {
const v1 = version1.length;
const v2 = version2.length;
let p1 = p2 = 0;
while (p1 < v1 || p2 < v2) {
let sum1 = sum2 = 0;
while (p1 < v1 && version1[p1] !== '.') {
sum1 = sum1 * 10 + version1[p1] * 1;
++p1;
}
++p1;
while (p2 < v2 && version2[p2] !== '.') {
sum2 = sum2 * 10 + version2[p2] * 1;
++p2;
}
++p2;
if (sum1 > sum2) return 1;
else if (sum1 < sum2) return -1;
}
return 0;
}
