问题描述
在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.
分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1
和 version2
,判断哪个版本更新,或者它们是否相同。
例如,2.5.33
和 0.1
都是有效的版本号。
当比较两个版本时,从左到右依次比较它们的修订号。忽略每个修订号的前导零,直接比较修订号对应的整数值。如果其中一个版本没有足够的修订号,缺失部分默认补为0
。
你需要根据以下规则返回比较结果:
- 如果
version1 > version2
,返回1
。 - 如果
version1 < version2
,返回-1
。 - 如果两个版本相等,返回
0
。
测试样例
样例1:
输入:
version1 = "0.1" , version2 = "1.1"
输出:-1
样例2:
输入:
version1 = "1.0.1" , version2 = "1"
输出:1
样例3:
输入:
version1 = "7.5.2.4" , version2 = "7.5.3"
输出:-1
样例4:
输入:
version1 = "1.0" , version2 = "1.0.0"
输出:0
首先我们把题意分析一下:
一、题意分析
-
版本号的格式与组成:
题目中明确指出,版本号是由一个或多个修订号组成的,各个修订号之间通过点号 “.” 进行分隔。并且每个修订号可能包含多位数字,同时还可能存在前导零的情况。例如 “2.5.33”“0.1” 这样的形式都是合法有效的版本号,这意味着我们在处理时需要正确解析这种格式的字符串,将其拆解为一个个可用于比较的修订号单元。 -
比较规则:
- 从左到右依次比较:比较两个版本号时,要按照从左到右的顺序逐个比较它们的修订号。这要求我们在实现算法时,需要模拟这种顺序比较的逻辑,不能随意打乱顺序或者跳跃式地比较修订号。
- 忽略前导零:在将修订号转换为用于比较的数值时,需要忽略其前导零。比如 “005” 和 “5” 在比较时应视为相等,这一点在进行数据处理和数值转换时要特别注意,保证符合题目要求的比较规则。
- 缺失部分补零:当两个版本号的修订号个数不一致时,少修订号的那个版本,其缺失的部分要默认补为 “0”。例如 “1.0” 和 “1.0.0” 进行比较时,要将 “1.0” 视为 “1.0.0” 来和后者进行一一对应的比较,这就需要我们在算法中对长度不一致的情况进行合理的补齐操作,使它们能在相同的维度上进行比较。
- 返回结果规定:根据比较结果按照既定规则返回相应的值,即如果
version1 > version2
,返回1
;如果version1 < version2
,返回-1
;如果两个版本相等,返回0
。这明确了最终答案的输出形式,我们的算法最终要能够根据比较情况准确输出符合要求的返回值。
二、解题思路
- 分割版本号字符串 :
使用编程语言中提供的字符串分割方法(如 Python 中的split
函数),依据 “.” 这个分隔符,将输入的版本号version1
和version2
分别拆分成多个修订号组成的列表。例如,对于版本号"1.0.1"
经过分割后会得到["1", "0", "1"]
这样的列表形式,方便后续按顺序对每个修订号进行处理和比较。 - 补齐长度差异 :
因为不同版本号的修订号个数可能不一样,为了能够让它们的修订号一一对应进行比较,需要对较短的版本号对应的修订号列表进行补齐操作。首先找出两个列表长度的最大值,然后针对较短的那个列表,在其末尾补充足够数量的 “0” 元素,使其长度达到最大值。比如版本号"1"
分割后是["1"]
,而"1.0.1"
分割后是["1", "0", "1"]
,那么就需要将["1"]
补充为["1", "0", "0"]
,这样就能和["1", "0", "1"]
逐个位置对应比较了。 - 依次比较修订号 :
通过循环遍历两个已经补齐长度的修订号列表(可以使用for
循环等方式,循环次数为补齐后的列表长度),在每次循环中,将对应位置的修订号字符串转换为整数(利用编程语言中合适的类型转换函数,如 Python 的int
函数,它会自动忽略前导零进行转换),然后比较这两个整数的大小。如果在某一位置上,version1
的修订号对应的整数大于version2
的修订号对应的整数,按照规则就返回1
;如果小于,则返回-1
;要是一直比较到最后所有位置的修订号对应的整数都相等,那就返回0
,表示两个版本号相等。
下面就可以写AC代码了:
def solution(version1, version2):
# 分割版本号
v1_parts = version1.split('.')
v2_parts = version2.split('.')
# 确定修订号最大长度
max_len = max(len(v1_parts), len(v2_parts))
# 遍历所有修订号
for i in range(max_len):
# 取出对应的修订号,缺失部分补为 0
num1 = int(v1_parts[i]) if i < len(v1_parts) else 0
num2 = int(v2_parts[i]) if i < len(v2_parts) else 0
# 比较修订号
if num1 > num2:
return 1
elif num1 < num2:
return -1
# 所有修订号都相等
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