版本号比较 | 豆包MarsCode AI 刷题

114 阅读3分钟

题目分析

问题描述: 给定两个版本号 version1version2,比较它们的大小。版本号由一个或多个修订号组成,每个修订号之间用 . 分隔。每个修订号都是一个非负整数,可能包含前导零。当所有修订号都用于比较后,按照以下规则返回结果:

  • 如果 version1 大于 version2,返回 1。
  • 如果 version1 小于 version2,返回 -1。
  • 如果 version1 等于 version2,返回 0。

示例:

  • compare_versions("0.1", "1.1") 应返回 -1
  • compare_versions("1.0.1", "1") 应返回 1
  • compare_versions("7.5.2.4", "7.5.3") 应返回 -1
  • compare_versions("1.0", "1.0.0") 应返回 0

解题思路

  1. 分割版本号

    • 将版本号字符串按 . 分割成多个部分,每个部分是一个修订号。
    • 例如,"1.0.1" 分割后得到 ["1", "0", "1"]
  2. 转换为整数

    • 将每个修订号从字符串转换为整数,以去除前导零的影响。
    • 例如,"010" 转换为 10
  3. 补齐较短的版本号

    • 由于版本号的各个部分可能长度不同,需要将较短的版本号补齐,使其与较长的版本号具有相同的长度。
    • 例如,比较 1.0.1 和 1 时,将 1 补齐为 1.0.0
  4. 逐个比较修订号

    • 从左到右逐个比较两个版本号的对应部分。
    • 如果某个部分 version1 的修订号大于 version2 的修订号,返回 1。
    • 如果某个部分 version1 的修订号小于 version2 的修订号,返回 -1。
    • 如果所有部分都相等,返回 0。

详细步骤

代码实现

我们可以通过以下步骤来实现这个功能:

  1. 分割版本号:将版本号字符串按 . 分割成列表,并将每个部分转换为整数。
  2. 补齐较短的版本号:确保两个版本号列表的长度相同,较短的版本号列表在末尾补 0。
  3. 逐个比较修订号:从左到右逐个比较两个版本号列表中的对应部分,直到找到不同的部分。
  4. 返回比较结果:如果找到一个部分大于另一个,则返回相应的结果;如果没有找到差异,则返回 0。

代码讲解


def compare_versions(version1, version2):

    parts1 = [int(part) for part in version1.split('.')]
    parts2 = [int(part) for part in version2.split('.')]


    max_length = max(len(parts1), len(parts2))
    parts1.extend([0] * (max_length - len(parts1)))
    parts2.extend([0] * (max_length - len(parts2)))


    for i in range(max_length):
        if parts1[i] > parts2[i]:
            return 1
        elif parts1[i] < parts2[i]:
            return -1

    return 0

print(compare_versions("0.1", "1.1"))  # 应输出 -1
print(compare_versions("1.0.1", "1"))  # 应输出 1
print(compare_versions("7.5.2.4", "7.5.3"))  # 应输出 -1
print(compare_versions("1.0", "1.0.0"))  # 应输出 0

详细步骤说明

  1. 分割版本号

    parts1 = [int(part) for part in version1.split('.')]
    parts2 = [int(part) for part in version2.split('.')]
    

    这里使用 split('.') 方法将版本号字符串按 . 分割成列表,然后使用列表推导式将每个部分转换为整数。

  2. 补齐较短的版本号

    max_length = max(len(parts1), len(parts2))
    parts1.extend([0] * (max_length - len(parts1)))
    parts2.extend([0] * (max_length - len(parts2)))
    

    计算两个版本号列表的最大长度,然后使用 extend 方法将较短的列表在末尾补 0,使其与较长的列表长度相同。

  3. 逐个比较修订号

    for i in range(max_length):
        if parts1[i] > parts2[i]:
            return 1
        elif parts1[i] < parts2[i]:
            return -1
    

    从左到右逐个比较两个版本号列表中的对应部分。如果找到一个部分大于另一个,则返回 1;如果找到一个部分小于另一个,则返回 -1。

  4. 返回比较结果

    return 0
    

    如果所有修订号都相同,则返回 0。