返回

解读 LeetCode 165:巧解比较版本号难题

后端

比较版本号:LeetCode 165 题详解

在编程领域,版本号无处不在,从软件更新到应用程序迭代,它们都扮演着至关重要的角色。在 LeetCode 的第 165 题中,我们面临着一个看似简单的挑战:比较两个版本号。然而,在这个看似平凡的任务背后,隐藏着一些微妙的陷阱。

版本号的组成与比较规则

版本号由一系列修订号组成,修订号之间用点号(.)分隔。每个修订号由一个或多个数字组成,可以包含前导零。例如,版本号 "1.0.1" 由三个修订号组成:主版本号(1)、次版本号(0)和补丁版本号(1)。

比较版本号时,遵循以下规则:

  • 从左到右逐个比较修订号。
  • 如果某个修订号在版本号 1 中大于版本号 2,则版本号 1 大于版本号 2。
  • 如果某个修订号在版本号 1 中等于版本号 2,则继续比较下一个修订号。
  • 如果版本号 1 遍历完所有修订号,版本号 2 仍有修订号未遍历完,则版本号 2 大于版本号 1。

解决 LeetCode 165 题

基于上述比较规则,我们可以设计一个算法来解决 LeetCode 165 题:

  1. 将版本号字符串分割成修订号数组。
  2. 遍历修订号数组,逐个比较修订号。
  3. 如果某个修订号不同,则比较结束,返回比较结果。
  4. 如果所有修订号都相同,则比较下一对修订号,或返回相等结果。

代码示例(Python)

def compareVersion(version1, version2):
  """
  比较两个版本号。

  :param version1: 版本号 1
  :param version2: 版本号 2
  :return: 版本号比较结果(-1、0 或 1)
  """

  # 将版本号字符串分割成修订号数组
  v1 = version1.split(".")
  v2 = version2.split(".")

  # 逐个比较修订号
  for i in range(max(len(v1), len(v2))):
    # 获取当前修订号
    n1 = int(v1[i]) if i < len(v1) else 0
    n2 = int(v2[i]) if i < len(v2) else 0

    # 比较修订号
    if n1 > n2:
      return 1
    elif n1 < n2:
      return -1

  # 所有修订号都相同
  return 0

常见问题解答

  • 为什么版本号中可以包含前导零?

答:前导零用于保持版本号的一致性,使它们易于比较。例如,版本号 "1.0" 和 "1.00" 是相等的,都表示主版本号为 1,次版本号为 0,补丁版本号为 0。

  • 如何处理不完整的版本号(例如 "1" 或 "1.0.1-")?

答:在比较版本号时,不完整的版本号应该被视为其修订号尾部带有无限个零的版本号。例如,版本号 "1" 被视为 "1.0.0.0",版本号 "1.0.1-" 被视为 "1.0.1.0"。

  • 如果版本号中有无效字符(例如字母或符号),应该如何处理?

答:如果版本号中包含无效字符,则该版本号无效,并且无法与其他版本号比较。

  • 如何比较具有不同数量修订号的版本号?

答:如果两个版本号具有不同数量的修订号,则较短的版本号在比较时将被视为具有附加的零修订号。例如,版本号 "1.0" 被视为 "1.0.0",以便与版本号 "1.0.1" 比较。

  • 除了修订号之外,版本号还有其他组件吗?

答:除了修订号之外,版本号有时还包含前缀(例如 "v" 或 "r") 和后缀(例如 "-beta" 或 "-rc")。这些组件不参与版本号的比较。