伴学笔记 | 豆包MarsCode AI 刷题

109 阅读3分钟

AI刷题:版本号比较

问题描述:

我们需要比较两个版本号,看看哪个版本更新,或者它们是否相同。

比如,1.0.1 和 2.5.33 都是版本号。

思路:

1.从左到右,逐个比较版本号中的数字(修订号)。

2.忽略数字前面的零,直接比较数字的大小。

3.如果一个版本号的数字比另一个多,多的部分默认视为 0。

代码解释

1.分割版本号:

用 split('.') 将版本号字符串分割成修订号列表。

比如,把"1.0.1" 分割成 ["1", "0", "1"]。

2.逐个比较修订号:

初始化两个指针 i 和 j,分别指向两个修订号列表的起始位置。

同时遍历两个列表,将修订号转换为整数并进行比较。

如果 version1 > version2,返回 1。

如果 version1 < version2,返回 -1。

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

3.处理剩余修订号:

如果其中一个列表遍历完毕,处理另一个列表的剩余修订号。

把剩余的修订号当作 0,然后继续比较。

如果剩余修订号中有非零的值,就返回相应的比较结果。

4.返回结果:

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

代码实现:


def solution(version1, version2):
    # Edit your code here
    

    # 将版本号按照 '.' 分割成列表
    v1_list = version1.split('.')
    v2_list = version2.split('.')
    # 初始化两个指针
    i = 0
    j = 0
    # 同时遍历两个列表
    while i < len(v1_list) and j < len(v2_list):
        try:
            num1 = int(v1_list[i].lstrip('0'))
        except ValueError:
            num1 = 0
        try:
            num2 = int(v2_list[j].lstrip('0'))
        except ValueError:
            num2 = 0
        # 比较当前位置的修订号
        if num1 > num2:
            return 1
        elif num1 < num2:
            return -1
        # 指针后移
        i += 1
        j += 1
    # 处理剩余部分
    while i < len(v1_list):
        try:
            num1 = int(v1_list[i].lstrip('0'))
        except ValueError:
            num1 = 0
        if num1 > 0:
            return 1
        i += 1
    while j < len(v2_list):
        try:
            num2 = int(v2_list[j].lstrip('0'))
        except ValueError:
            num2 = 0
        if num2 > 0:
            return -1
        j += 1
    # 都没有剩余或者剩余的修订号都为 0
    return 0
    


思考:

在设计这个版本号比较的算法时,我深刻体会到以下几点:

抽象问题的能力: 将版本号比较的实际问题抽象为修订号列表的逐个比较,是解决本题的关键。这让我意识到,抽象问题的能力在算法设计中非常重要。通过将具体的、复杂的版本号比较问题转化为可量化、有规律可循的修订号列表比较问题,我们可以利用已有的编程知识和方法进行求解。这种抽象能力不仅简化了问题的复杂性,还使得问题的解决过程更加清晰和有条理。

特殊情况的处理: 在解题过程中,我首先对不同长度的修订号列表进行了特殊处理。如果一个版本号的修订号列表比另一个长,需要将缺失的部分视为 0。这种特殊情况的处理表明,在解决问题时,不能忽视特殊情况,要先确保这些特殊情况得到正确处理,才能顺利进行后续的一般性计算。通过合理处理特殊情况,我们可以确保算法的健壮性和正确性。

逐步优化的价值 :在实现过程中,我逐步优化了代码,去除了不必要的异常处理,简化了逻辑。这让我体会到代码优化的重要性,以及如何通过逐步改进来提高代码质量。通过去除不必要的异常处理和简化逻辑,我不仅提高了代码的性能,还增强了代码的可读性和可维护性