刷题记录:118.版本号比较 | 豆包MarsCode AI刷题

57 阅读4分钟

问题描述

在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 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

问问MarsCode AI!

好的,让我们来分析一下这个问题的解题思路。

问题理解

你需要比较两个版本号 version1version2,判断哪个版本更新,或者它们是否相同。版本号由一个或多个修订号组成,修订号之间由点号 . 分隔。每个修订号可能有多位数字,并且可能会包含前导零。

数据结构选择

由于版本号是由点号分隔的修订号组成的字符串,我们可以将每个版本号拆分成一个修订号的列表。这样,我们可以逐个比较修订号。

算法步骤

  1. 拆分版本号:将 version1version2 分别拆分成修订号的列表。
  2. 逐个比较修订号:从左到右依次比较修订号。如果其中一个版本没有足够的修订号,缺失部分默认补为 0
  3. 比较修订号
    • 如果 version1 的某个修订号大于 version2 的对应修订号,返回 1
    • 如果 version1 的某个修订号小于 version2 的对应修订号,返回 -1
    • 如果所有修订号都相等,返回 0

具体步骤

  1. 使用 split('.') 方法将版本号拆分成修订号的列表。
  2. 使用 int() 函数将修订号转换为整数,以便忽略前导零。
  3. 使用循环逐个比较修订号,确保处理不同长度的修订号列表。

通过这些步骤,你可以实现一个函数来比较两个版本号。希望这些思路对你有帮助!如果你有任何具体问题或需要进一步的代码提示,请告诉我。

我的解答与思路

def solution(version1, version2):
    # Edit your code here
    v1 = version1.split('.')
    v2 = version2.split('.')
    l1 = len(v1)
    l2 = len(v2)
    flag = 0
    for i in range(max(l1, l2)):
        if i < min(l1, l2):
            n1, n2 = int(v1[i]), int(v2[i])
            if n1 > n2:
                return 1
            if n1 < n2:
                return -1
        elif l1>l2:
            if int(v1[i])>0: return 1
        elif l1<l2:
            if int(v2[i])>0: return -1
    return 0

这道题是比较两个版本号 version1version2 的大小。我的代码思路是首先将两个版本号字符串通过 split('.') 方法分割成数字字符串列表,然后逐一比较对应的数字部分。

首先,我分别用 v1v2 来存储这两个版本号的数字列表,并计算它们的长度 l1l2。然后,我开始一个 for 循环,从两个版本号的第一部分开始进行比较。我会遍历到最长的版本号长度(max(l1, l2))。对于每一位,首先检查当前索引是否在两个列表的范围内。如果在范围内,我将它们转换成整数进行比较。若 n1 > n2,则返回 1,若 n1 < n2,则返回 -1

如果两个版本号的某一部分已经比对完,而另一个版本号还有额外的部分(即长度不同),我会检查较长版本号的剩余部分是否有非零的数字。若有,表示这个版本号更大,返回相应的值。

最后,如果两个版本号的所有部分都相等,则返回 0,表示两个版本号相同。

总体来说,我的思路是分割字符串,逐位比较数字,并处理版本号长度不一致的情况。