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

50 阅读4分钟

问题描述

在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1 和 version2,判断哪个版本更新,或者它们是否相同。

例如,2.5.33 和 0.1 都是有效的版本号。

当比较两个版本时,从左到右依次比较它们的修订号。忽略每个修订号的前导零,直接比较修订号对应的整数值。如果其中一个版本没有足够的修订号,缺失部分默认补为0。

你需要根据以下规则返回比较结果:

如果 version1 > version2,返回 1。

如果 version1 < version2,返回 -1。

如果两个版本相等,返回 0。

问题理解

我们先对问题进行概括以及拆分

这个问题要求我们比较两个版本号,版本号由多个修订号组成,修订号之间用点号 . 分隔。我们需要从左到右逐个比较修订号,忽略前导零,并确保即使一个版本号较短也能通过补 0 来完成比较。最终根据修订号的比较结果判断版本号的先后顺序。

版本号结构:

版本号由一个或多个修订号组成,修订号之间用点号 . 分隔。

修订号比较:

从左到右逐个比较修订号,忽略前导零,直接比较修订号对应的整数值。

补 0 机制:

如果一个版本号没有足够的修订号,缺失部分默认补为 0。例如,1.0.1 和 1 比较时,1 会补成 1.0.0。

比较结果:

如果 version1 > version2,返回 1。

如果 version1 < version2,返回 -1。

如果两个版本相等,返回 0。

技术实现

拆分版本号:

使用 split('.') 方法将版本号拆分成修订号列表。

逐个比较修订号:

使用 zip_longest 函数(在 Python 中需要 itertools 模块)来逐个比较修订号,确保即使一个版本号较短也能补 0。

转换为整数比较:

将修订号转换为整数并比较,确保忽略前导零。

返回比较结果:

根据修订号的比较结果返回 1、-1 或 0。

通过以上步骤,我们可以逐个比较修订号,确保正确判断版本号的先后顺序。

时间复杂度分析

这个方法的时间复杂度是 O(n),其中 n 是修订号的最大数量。

算法实现

拆分版本号:

使用 split('.') 方法将版本号拆分成修订号列表。 例如,version1 = "1.0.1" 拆分后得到 ['1', '0', '1']

逐个比较修订号:

使用 zip_longest 函数(在 Python 中需要 itertools 模块)来逐个比较修订号,确保即使一个版本号较短也能补 0。

例如,version1 = "1.0.1"version2 = "1" 比较时,version2 的修订号列表会补 0,变成 ['1', '0', '0']

比较修订号:

将修订号转换为整数并比较。

如果 version1 的某个修订号大于 version2 的对应修订号,返回 1。

如果 version1 的某个修订号小于 version2 的对应修订号,返回 -1。

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

*那我们算法实现和前置条件已经准备就绪那我们可以开始代码的编写了*

主要步骤代码展示

version1.split('.')version2.split('.') 将版本号拆分成修订号列表。

zip_longest(v1_parts, v2_parts, fillvalue='0') 确保即使一个版本号较短也能补 0。

int(v1_part)int(v2_part) 将修订号转换为整数并比较。

收获

通过解决这个题目,我学习到了字符串操作、迭代器和生成器、条件判断、算法设计、测试和调试、时间复杂度分析以及模块导入等知识点。掌握了字符串拆分、整数转换、使用 zip_longest 逐个比较修订号、编写测试用例、调试代码以及分析时间复杂度等相关技能。

完整代码


def solution(version1, version2):
    # 将版本号拆分成修订号列表
    v1_parts = version1.split('.')
    v2_parts = version2.split('.')
    
    # 逐个比较修订号
    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

if __name__ == "__main__":
    # Add your test cases here
    print(solution("0.1", "1.1") == -1)
    print(solution("1.0.1", "1") == 1)
    print(solution("7.5.2.4", "7.5.3") == -1)
    print(solution("1.0", "1.0.0") == 0)