165. 比较版本号

LeetCode 原题链接

题目描述

版本号由点号分隔的修订号组成。逐段比较两个版本号:忽略前导零,缺失的修订号视为 0。前者大返回 1,小返回 -1,相等返回 0

输入:version1 = "1.01", version2 = "1.001"
输出:0

输入:version1 = "1.0", version2 = "1.0.0"
输出:0

题型判断

版本号不能按普通字符串字典序比较,因为 "10""2" 的字符串顺序与数值顺序不同。应按点分段,再逐段按数值比较。

核心思路

  1. split(".") 得到修订号数组。
  2. 遍历到两者较长的长度。
  3. 缺失段用 0 补齐,转换为数值后比较。
  4. 第一个不相等的修订号决定最终结果。

代码实现

var compareVersion = function (version1, version2) {
  const firstParts = version1.split(".");
  const secondParts = version2.split(".");
  const length = Math.max(firstParts.length, secondParts.length);

  for (let i = 0; i < length; i++) {
    const firstRevision = Number(firstParts[i] ?? 0);
    const secondRevision = Number(secondParts[i] ?? 0);

    if (firstRevision > secondRevision) return 1;
    if (firstRevision < secondRevision) return -1;
  }

  return 0;
};

复杂度与易错点

  • 时间复杂度:O(m + n),需要读取两个版本字符串。
  • 空间复杂度:O(m + n)split 创建分段数组。
  • "1.0""1" 相等,不能只比较分段数量。
  • 前导零不影响修订号数值。
  • 题目约束保证修订号可安全转为整数;若修订号可能超过安全整数范围,应去除前导零后比较字符串长度和字典序。