题目分析
问题描述: 给定两个版本号 version1 和 version2,比较它们的大小。版本号由一个或多个修订号组成,每个修订号之间用 . 分隔。每个修订号都是一个非负整数,可能包含前导零。当所有修订号都用于比较后,按照以下规则返回结果:
- 如果
version1大于version2,返回 1。 - 如果
version1小于version2,返回 -1。 - 如果
version1等于version2,返回 0。
示例:
compare_versions("0.1", "1.1")应返回-1。compare_versions("1.0.1", "1")应返回1。compare_versions("7.5.2.4", "7.5.3")应返回-1。compare_versions("1.0", "1.0.0")应返回0。
解题思路
-
分割版本号:
- 将版本号字符串按
.分割成多个部分,每个部分是一个修订号。 - 例如,
"1.0.1"分割后得到["1", "0", "1"]。
- 将版本号字符串按
-
转换为整数:
- 将每个修订号从字符串转换为整数,以去除前导零的影响。
- 例如,
"010"转换为10。
-
补齐较短的版本号:
- 由于版本号的各个部分可能长度不同,需要将较短的版本号补齐,使其与较长的版本号具有相同的长度。
- 例如,比较
1.0.1和1时,将1补齐为1.0.0。
-
逐个比较修订号:
- 从左到右逐个比较两个版本号的对应部分。
- 如果某个部分
version1的修订号大于version2的修订号,返回 1。 - 如果某个部分
version1的修订号小于version2的修订号,返回 -1。 - 如果所有部分都相等,返回 0。
详细步骤
代码实现
我们可以通过以下步骤来实现这个功能:
- 分割版本号:将版本号字符串按
.分割成列表,并将每个部分转换为整数。 - 补齐较短的版本号:确保两个版本号列表的长度相同,较短的版本号列表在末尾补 0。
- 逐个比较修订号:从左到右逐个比较两个版本号列表中的对应部分,直到找到不同的部分。
- 返回比较结果:如果找到一个部分大于另一个,则返回相应的结果;如果没有找到差异,则返回 0。
代码讲解
def compare_versions(version1, version2):
parts1 = [int(part) for part in version1.split('.')]
parts2 = [int(part) for part in version2.split('.')]
max_length = max(len(parts1), len(parts2))
parts1.extend([0] * (max_length - len(parts1)))
parts2.extend([0] * (max_length - len(parts2)))
for i in range(max_length):
if parts1[i] > parts2[i]:
return 1
elif parts1[i] < parts2[i]:
return -1
return 0
print(compare_versions("0.1", "1.1")) # 应输出 -1
print(compare_versions("1.0.1", "1")) # 应输出 1
print(compare_versions("7.5.2.4", "7.5.3")) # 应输出 -1
print(compare_versions("1.0", "1.0.0")) # 应输出 0
详细步骤说明
-
分割版本号:
parts1 = [int(part) for part in version1.split('.')] parts2 = [int(part) for part in version2.split('.')]这里使用
split('.')方法将版本号字符串按.分割成列表,然后使用列表推导式将每个部分转换为整数。 -
补齐较短的版本号:
max_length = max(len(parts1), len(parts2)) parts1.extend([0] * (max_length - len(parts1))) parts2.extend([0] * (max_length - len(parts2)))计算两个版本号列表的最大长度,然后使用
extend方法将较短的列表在末尾补 0,使其与较长的列表长度相同。 -
逐个比较修订号:
for i in range(max_length): if parts1[i] > parts2[i]: return 1 elif parts1[i] < parts2[i]: return -1从左到右逐个比较两个版本号列表中的对应部分。如果找到一个部分大于另一个,则返回 1;如果找到一个部分小于另一个,则返回 -1。
-
返回比较结果:
return 0如果所有修订号都相同,则返回 0。