LeetCode 「中等」165.比较版本号

sankigan2025-2-17算法LeetCode

比较版本号open in new window

题目描述

给你两个版本号字符串 version1version2,请你比较它们。版本号由被点 '.' 分开的修订号组成。修订号的值是它转换为整数并忽略前导零。

比较版本号时,请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较少,则将缺失的修订号视为 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;
}
更新于 2025/3/20 23:23:29