返回

揭秘LeetCode 165:比较版本号算法中的玄妙之处

后端

一、算法简介

LeetCode 165题:比较版本号要求比较两个版本号的大小。版本号由一个或多个数字组成,数字之间用点号分隔。版本号的比较规则是,从左到右逐个比较每个数字,如果某一位数字不同,则比较结果取决于该位数字的大小。如果所有位数字都相同,则两个版本号相等。

二、算法解析

实现版本比较算法,关键在于理解版本号的比较规则。以下为算法的详细解析:

  1. 将两个版本号字符串拆分为数字数组,以便逐个比较数字。
  2. 比较数字数组的长度,如果长度不同,则较短的数组填充0以保持长度一致。
  3. 从左到右逐个比较每个数字,如果某一位数字不同,则比较结果取决于该位数字的大小。
  4. 如果所有位数字都相同,则两个版本号相等。

三、实现步骤

以下为算法的详细实现步骤:

  1. 将两个版本号字符串拆分为数字数组:
def split_version(version):
    """
    将版本号字符串拆分为数字数组

    Args:
        version: 版本号字符串

    Returns:
        数字数组
    """
    return [int(num) for num in version.split('.')]
  1. 比较数字数组的长度,如果长度不同,则较短的数组填充0以保持长度一致:
def pad_zero(array, length):
    """
    将数组填充0以保持长度一致

    Args:
        array: 需要填充的数组
        length: 目标长度

    Returns:
        填充后的数组
    """
    while len(array) < length:
        array.append(0)
    return array
  1. 从左到右逐个比较每个数字,如果某一位数字不同,则比较结果取决于该位数字的大小:
def compare_version(version1, version2):
    """
    比较两个版本号的大小

    Args:
        version1: 版本号1
        version2: 版本号2

    Returns:
        比较结果 (-1, 0, 1)
    """
    # 将版本号字符串拆分为数字数组
    version1 = split_version(version1)
    version2 = split_version(version2)

    # 比较数字数组的长度
    if len(version1) < len(version2):
        version1 = pad_zero(version1, len(version2))
    elif len(version1) > len(version2):
        version2 = pad_zero(version2, len(version1))

    # 从左到右逐个比较每个数字
    for i in range(len(version1)):
        if version1[i] < version2[i]:
            return -1
        elif version1[i] > version2[i]:
            return 1

    # 如果所有位数字都相同,则两个版本号相等
    return 0

四、示例代码

以下为算法的示例代码:

def main():
    # 测试用例
    test_cases = [
        ("1.0.1", "1.0.2"),
        ("1.0.2", "1.0.1"),
        ("1.0", "1.0.0"),
        ("1.0.0", "1.0"),
        ("1.0.1", "1.1"),
        ("1.1", "1.0.1"),
        ("1.1.0", "1.1"),
        ("1.1", "1.1.0"),
        ("1.0.1", "1"),
        ("1", "1.0.1")
    ]

    # 比较版本号
    for case in test_cases:
        result = compare_version(case[0], case[1])
        print(f"{case[0]} vs {case[1]}: {result}")


if __name__ == "__main__":
    main()

输出结果:

1.0.1 vs 1.0.2: -1
1.0.2 vs 1.0.1: 1
1.0 vs 1.0.0: 0
1.0.0 vs 1.0: 0
1.0.1 vs 1.1: -1
1.1 vs 1.0.1: 1
1.1.0 vs 1.1: 0
1.1 vs 1.1.0: 0
1.0.1 vs 1: 1
1 vs 1.0.1: -1

五、总结

LeetCode 165题:比较版本号算法,要求比较两个版本号的大小。算法的关键在于理解版本号的比较规则,并将其转化为代码实现。通过将版本号字符串拆分为数字数组,并逐个比较数字,可以实现版本号的比较。