版本号比较 | 豆包MarsCode AI刷题
简单模拟即可完成
摘要
本文介绍了如何比较两个版本号。版本号由多个修订号组成,修订号以点号分隔。我们通过逐级比较修订号来判断版本的先后关系。代码实现包括Python和Go的代码,并展示了各种边界情况的处理。
问题描述
给定两个版本号 version1 和 version2,要求比较版本的大小。如果 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)
}