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

134 阅读3分钟

问题描述

在软件项目中,版本号通常用来表示软件的版本。一个版本号由多个修订号组成,每个修订号用 . 分隔。例如,2.5.332.1 是有效的版本号。

我们需要编写一个函数,比较两个版本号 version1version2,并返回以下结果:

  • 如果 version1 > version2,返回 1
  • 如果 version1 < version2,返回 -1
  • 如果两者相等,返回 0

注意事项:

  1. 修订号不定长,例如 1.01.0.0 应视为相等。
  2. 缺失的修订号可以认为是 0

输入输出示例

示例 1:

输入:

version1="0.1",version2="1.1"version1 = "0.1", version2 = "1.1"version1="0.1",version2="1.1"

输出:

−1-1−1

示例 2:

输入:

version1="1.0.1",version2="1"version1 = "1.0.1", version2 = "1"version1="1.0.1",version2="1"

输出:

111

示例 3:

输入:

version1="7.5.2.4",version2="7.5.3"version1 = "7.5.2.4", version2 = "7.5.3"version1="7.5.2.4",version2="7.5.3"

输出:

−1-1−1

示例 4:

输入:

version1="1.0",version2="1.0.0"version1 = "1.0", version2 = "1.0.0"version1="1.0",version2="1.0.0"

输出:

000


解题思路

1. 分割版本号

我们可以使用 Python 的 split 方法将版本号字符串按 . 分割成列表,每个元素代表一个修订号。

2. 比较修订号

  • 使用 zip_longest 函数对两个修订号列表进行配对,逐对比较其整数值;
  • 如果两个列表长度不同,缺失的部分修订号可以视为 0

3. 返回结果

  • 当某个修订号不相等时,直接返回比较结果;
  • 如果所有修订号都相等,则返回 0

代码实现

def solution(version1, version2):
    # 将版本号按 `.` 分割成修订号列表
    v1_parts = version1.split('.')
    v2_parts = version2.split('.')

    # 使用 zip_longest 函数逐对比较修订号,缺失部分的修订号视为 0
    for v1_part, v2_part in zip_longest(v1_parts, v2_parts, fillvalue='0'):
        # 将修订号转换为整数并比较
        if int(v1_part) > int(v2_part):
            return 1
        elif int(v1_part) < int(v2_part):
            return -1

    # 所有修订号都相等
    return 0


示例解析

示例 1

输入:

version1="0.1",version2="1.1"version1 = "0.1", version2 = "1.1"version1="0.1",version2="1.1"

过程

  1. 将版本号分割为 v1_parts = ['0', '1']v2_parts = ['1', '1']
  2. 比较修订号:0 < 1,返回 -1

示例 2

输入:

version1="1.0.1",version2="1"version1 = "1.0.1", version2 = "1"version1="1.0.1",version2="1"

过程

  1. 分割为 v1_parts = ['1', '0', '1']v2_parts = ['1']
  2. 使用 zip_longest 补全:['1', '0', '1']['1', '0', '0']
  3. 比较修订号:1 == 10 == 01 > 0,返回 1

示例 3

输入:

version1="7.5.2.4",version2="7.5.3"version1 = "7.5.2.4", version2 = "7.5.3"version1="7.5.2.4",version2="7.5.3"

过程

  1. 分割为 v1_parts = ['7', '5', '2', '4']v2_parts = ['7', '5', '3']
  2. 使用 zip_longest 补全:['7', '5', '2', '4']['7', '5', '3', '0']
  3. 比较修订号:2 < 3,返回 -1

AI 使用

在实现这道题的过程中,MarsCode AI 提供了清晰的解决框架和代码模板:

优势

  1. 逻辑清晰

    • AI 建议使用 splitzip_longest,很好地处理了修订号分割和长度补全的问题。
    • 代码流程简单明了,易于理解和扩展。
  2. 细节完善

    • 提到了 fillvalue='0' 的处理方法,确保了长度不一致的修订号能正确比较。
  3. 快速实现

    • AI 能够在短时间内提供可用的代码,实现基本功能,为人工优化提供了良好基础。

不足

  1. 边界条件未明确说明

    • AI 提供的代码假设版本号只包含数字,但未明确处理非数字字符或非法输入的情况。
  2. 缺少效率优化建议

    • 代码中的 zip_longest 和逐项比较操作,虽然效率不低,但未提及更高效的替代方案。

优化建议

  1. 输入校验:加入非法输入检查,例如拒绝包含非数字字符的版本号;
  2. 性能优化:对于超长版本号列表,可考虑提前终止比较的条件。