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

110 阅读2分钟

题解:版本号比较

问题分析

题目要求对两个版本号 version1version2 进行比较,返回以下三种结果之一:

  1. 如果 version1 > version2,返回 1
  2. 如果 version1 < version2,返回 -1
  3. 如果二者相等,返回 0

版本号由点号 . 分隔的多个修订号组成,每个修订号可能有多位数字。需要注意忽略修订号前导零,并且当一个版本号较短时,默认其缺失的部分为 0


思路讲解

  1. 版本号分割
    使用 split('.') 方法将 version1version2 分割为修订号的列表,例如:

    • "1.0.1" 被分割为 ["1", "0", "1"]
    • "1" 被分割为 ["1"]
  2. 逐位比较
    遍历两个版本号的修订号列表,将每一位修订号转为整数后比较大小:

    • 若当前位的修订号不同,立即返回比较结果(1-1)。
    • 若当前位的修订号相同,则继续比较下一位。
  3. 补全较短版本号
    如果遍历完较短版本号后,较长版本号还有剩余部分,需要判断剩余部分是否全为 0

    • 如果全为 0,说明两版本号相等。
    • 如果存在非零修订号,则较长版本号更大。
  4. 返回结果
    如果所有修订号都相等,则返回 0


代码实现

def solution(version1, version2):
    # 分割版本号
    v1 = version1.split('.')
    v2 = version2.split('.')
    
    # 遍历修订号
    i = 0
    while i < len(v1) and i < len(v2):
        # 转为整数后比较
        if int(v1[i]) > int(v2[i]):
            return 1
        elif int(v1[i]) < int(v2[i]):
            return -1
        i += 1
    
    # 处理较长版本号的剩余部分
    while i < len(v1):
        if int(v1[i]) > 0:
            return 1
        i += 1
    while i < len(v2):
        if int(v2[i]) > 0:
            return -1
        i += 1
    
    # 如果所有修订号相等
    return 0

# 测试样例
if __name__ == "__main__":
    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)

复杂度分析

  1. 时间复杂度
    假设两个版本号的修订号个数分别为 mn,算法最多需要遍历 max(m, n) 次,时间复杂度为 ( O(\max(m, n)) )。

  2. 空间复杂度
    分割版本号时需要额外的存储空间,空间复杂度为 ( O(m + n) )。