刷题进展之初等题-版本号比较 | 豆包MarsCode AI刷题

2 阅读5分钟

问题描述

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

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

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

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

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

测试样例

样例1:

输入:version1 = "0.1" , version2 = "1.1"
输出:-1

样例2:

输入:version1 = "1.0.1" , version2 = "1"
输出:1

样例3:

输入:version1 = "7.5.2.4" , version2 = "7.5.3"
输出:-1

样例4:

输入:version1 = "1.0" , version2 = "1.0.0"
输出:0

首先我们把题意分析一下:

一、题意分析

  1. 版本号的格式与组成
    题目中明确指出,版本号是由一个或多个修订号组成的,各个修订号之间通过点号 “.” 进行分隔。并且每个修订号可能包含多位数字,同时还可能存在前导零的情况。例如 “2.5.33”“0.1” 这样的形式都是合法有效的版本号,这意味着我们在处理时需要正确解析这种格式的字符串,将其拆解为一个个可用于比较的修订号单元。

  2. 比较规则

    • 从左到右依次比较:比较两个版本号时,要按照从左到右的顺序逐个比较它们的修订号。这要求我们在实现算法时,需要模拟这种顺序比较的逻辑,不能随意打乱顺序或者跳跃式地比较修订号。
    • 忽略前导零:在将修订号转换为用于比较的数值时,需要忽略其前导零。比如 “005” 和 “5” 在比较时应视为相等,这一点在进行数据处理和数值转换时要特别注意,保证符合题目要求的比较规则。
    • 缺失部分补零:当两个版本号的修订号个数不一致时,少修订号的那个版本,其缺失的部分要默认补为 “0”。例如 “1.0” 和 “1.0.0” 进行比较时,要将 “1.0” 视为 “1.0.0” 来和后者进行一一对应的比较,这就需要我们在算法中对长度不一致的情况进行合理的补齐操作,使它们能在相同的维度上进行比较。
    • 返回结果规定:根据比较结果按照既定规则返回相应的值,即如果 version1 > version2,返回 1;如果 version1 < version2,返回 -1;如果两个版本相等,返回 0。这明确了最终答案的输出形式,我们的算法最终要能够根据比较情况准确输出符合要求的返回值。

二、解题思路

  1. 分割版本号字符串
    使用编程语言中提供的字符串分割方法(如 Python 中的 split 函数),依据 “.” 这个分隔符,将输入的版本号 version1 和 version2 分别拆分成多个修订号组成的列表。例如,对于版本号 "1.0.1" 经过分割后会得到 ["1", "0", "1"] 这样的列表形式,方便后续按顺序对每个修订号进行处理和比较。
  2. 补齐长度差异
    因为不同版本号的修订号个数可能不一样,为了能够让它们的修订号一一对应进行比较,需要对较短的版本号对应的修订号列表进行补齐操作。首先找出两个列表长度的最大值,然后针对较短的那个列表,在其末尾补充足够数量的 “0” 元素,使其长度达到最大值。比如版本号 "1" 分割后是 ["1"],而 "1.0.1" 分割后是 ["1", "0", "1"],那么就需要将 ["1"] 补充为 ["1", "0", "0"],这样就能和 ["1", "0", "1"] 逐个位置对应比较了。
  3. 依次比较修订号
    通过循环遍历两个已经补齐长度的修订号列表(可以使用 for 循环等方式,循环次数为补齐后的列表长度),在每次循环中,将对应位置的修订号字符串转换为整数(利用编程语言中合适的类型转换函数,如 Python 的 int 函数,它会自动忽略前导零进行转换),然后比较这两个整数的大小。如果在某一位置上, version1 的修订号对应的整数大于 version2 的修订号对应的整数,按照规则就返回 1;如果小于,则返回 -1;要是一直比较到最后所有位置的修订号对应的整数都相等,那就返回 0,表示两个版本号相等。

下面就可以写AC代码了:

def solution(version1, version2):
    # 分割版本号
    v1_parts = version1.split('.')
    v2_parts = version2.split('.')
    
    # 确定修订号最大长度
    max_len = max(len(v1_parts), len(v2_parts))
    
    # 遍历所有修订号
    for i in range(max_len):
        # 取出对应的修订号,缺失部分补为 0
        num1 = int(v1_parts[i]) if i < len(v1_parts) else 0
        num2 = int(v2_parts[i]) if i < len(v2_parts) else 0
        
        # 比较修订号
        if num1 > num2:
            return 1
        elif num1 < num2:
            return -1
    
    # 所有修订号都相等
    return 0


if __name__ == "__main__":
    # 添加测试用例
    print(solution("0.1", "1.1") == -1)      # 应返回 True
    print(solution("1.0.1", "1") == 1)       # 应返回 True
    print(solution("7.5.2.4", "7.5.3") == -1) # 应返回 True
    print(solution("1.0", "1.0.0") == 0)     # 应返回 True