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

76 阅读2分钟

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

版本号比较 - MarsCode

简单模拟即可完成

摘要

本文介绍了如何比较两个版本号。版本号由多个修订号组成,修订号以点号分隔。我们通过逐级比较修订号来判断版本的先后关系。代码实现包括Python和Go的代码,并展示了各种边界情况的处理。

问题描述

给定两个版本号 version1version2,要求比较版本的大小。如果 version1 大于 version2,返回 1;如果 version1 小于 version2,返回 -1;如果它们相等,返回 0

示例

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

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

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

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

原理分析

1. 分割与解析

首先,将两个版本号通过 . 分割,解析每个修订号为整数,并存储在列表中。这样可以直接比较修订号的数值。

2. 补齐零

为了进行逐级比较,将较短的版本号用 0 补齐至与较长的版本号相同的长度。这样可以一一对应地比较修订号。

3. 比较过程

逐级比较修订号的数值:

  • 若当前级别的修订号 version1 大于 version2,则返回 1
  • 若当前级别的修订号 version1 小于 version2,则返回 -1
  • 若两者相等,继续比较下一级修订号。

若所有修订号相等,则返回 0

代码实现

Python代码

def solution(version1: str, version2: str) -> int:
    """
    比较两个版本号 version1 和 version2。
    如果 version1 > version2,返回 1;如果 version1 < version2,返回 -1;如果相等,返回 0。
    """
    # 使用 "." 分割版本号字符串,并将每部分转换为整数列表
    v1_parts = list(map(int, version1.split('.')))
    v2_parts = list(map(int, version2.split('.')))

    # 遍历所有部分,补零比较
    for i in range(max(len(v1_parts), len(v2_parts))):
        num1 = v1_parts[i] if i < len(v1_parts) else 0
        num2 = v2_parts[i] if i < len(v2_parts) else 0

        if num1 > num2:
            return 1
        elif num1 < num2:
            return -1

    # 如果所有部分都相等,则返回 0
    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

Go语言代码

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func solution(version1 string, version2 string) int {
	sep := "."
	v1str := strings.Split(version1, sep)
	v2str := strings.Split(version2, sep)

	for i := 0; i < len(v1str) || i < len(v2str); i++ {
		num1, num2 := 0, 0
		if i < len(v1str) {
			num1, _ = strconv.Atoi(v1str[i])
		}
		if i < len(v2str) {
			num2, _ = strconv.Atoi(v2str[i])
		}
		if num1 > num2 {
			return 1
		} else if num1 < num2 {
			return -1
		}
	}

	return 0
}

func main() {
	// 测试用例
	fmt.Println(solution("0.1", "1.1") == -1)
	fmt.Println(solution("1.0.1", "1") == 1)
	fmt.Println(solution("7.5.2.4", "7.5.3") == -1)
	fmt.Println(solution("1.0", "1.0.0") == 0)
}