问题描述
在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 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