题解:版本号比较
问题分析
题目要求对两个版本号 version1 和 version2 进行比较,返回以下三种结果之一:
- 如果
version1 > version2,返回1。 - 如果
version1 < version2,返回-1。 - 如果二者相等,返回
0。
版本号由点号 . 分隔的多个修订号组成,每个修订号可能有多位数字。需要注意忽略修订号前导零,并且当一个版本号较短时,默认其缺失的部分为 0。
思路讲解
-
版本号分割
使用split('.')方法将version1和version2分割为修订号的列表,例如:"1.0.1"被分割为["1", "0", "1"]。"1"被分割为["1"]。
-
逐位比较
遍历两个版本号的修订号列表,将每一位修订号转为整数后比较大小:- 若当前位的修订号不同,立即返回比较结果(
1或-1)。 - 若当前位的修订号相同,则继续比较下一位。
- 若当前位的修订号不同,立即返回比较结果(
-
补全较短版本号
如果遍历完较短版本号后,较长版本号还有剩余部分,需要判断剩余部分是否全为0:- 如果全为
0,说明两版本号相等。 - 如果存在非零修订号,则较长版本号更大。
- 如果全为
-
返回结果
如果所有修订号都相等,则返回0。
代码实现
def solution(version1, version2):
# 分割版本号
v1 = version1.split('.')
v2 = version2.split('.')
# 遍历修订号
i = 0
while i < len(v1) and i < len(v2):
# 转为整数后比较
if int(v1[i]) > int(v2[i]):
return 1
elif int(v1[i]) < int(v2[i]):
return -1
i += 1
# 处理较长版本号的剩余部分
while i < len(v1):
if int(v1[i]) > 0:
return 1
i += 1
while i < len(v2):
if int(v2[i]) > 0:
return -1
i += 1
# 如果所有修订号相等
return 0
# 测试样例
if __name__ == "__main__":
print(solution("0.1", "1.1") == -1)
print(solution("1.0.1", "1") == 1)
print(solution("7.5.2.4", "7.5.3") == -1)
print(solution("1.0", "1.0.0") == 0)
复杂度分析
-
时间复杂度
假设两个版本号的修订号个数分别为m和n,算法最多需要遍历max(m, n)次,时间复杂度为 ( O(\max(m, n)) )。 -
空间复杂度
分割版本号时需要额外的存储空间,空间复杂度为 ( O(m + n) )。