问题描述
在软件项目中,版本号通常用来表示软件的版本。一个版本号由多个修订号组成,每个修订号用 . 分隔。例如,2.5.33 和 2.1 是有效的版本号。
我们需要编写一个函数,比较两个版本号 version1 和 version2,并返回以下结果:
- 如果
version1 > version2,返回1; - 如果
version1 < version2,返回-1; - 如果两者相等,返回
0。
注意事项:
- 修订号不定长,例如
1.0和1.0.0应视为相等。 - 缺失的修订号可以认为是
0。
输入输出示例
示例 1:
输入:
version1="0.1",version2="1.1"version1 = "0.1", version2 = "1.1"version1="0.1",version2="1.1"
输出:
−1-1−1
示例 2:
输入:
version1="1.0.1",version2="1"version1 = "1.0.1", version2 = "1"version1="1.0.1",version2="1"
输出:
111
示例 3:
输入:
version1="7.5.2.4",version2="7.5.3"version1 = "7.5.2.4", version2 = "7.5.3"version1="7.5.2.4",version2="7.5.3"
输出:
−1-1−1
示例 4:
输入:
version1="1.0",version2="1.0.0"version1 = "1.0", version2 = "1.0.0"version1="1.0",version2="1.0.0"
输出:
000
解题思路
1. 分割版本号
我们可以使用 Python 的 split 方法将版本号字符串按 . 分割成列表,每个元素代表一个修订号。
2. 比较修订号
- 使用
zip_longest函数对两个修订号列表进行配对,逐对比较其整数值; - 如果两个列表长度不同,缺失的部分修订号可以视为
0。
3. 返回结果
- 当某个修订号不相等时,直接返回比较结果;
- 如果所有修订号都相等,则返回
0。
代码实现
def solution(version1, version2):
# 将版本号按 `.` 分割成修订号列表
v1_parts = version1.split('.')
v2_parts = version2.split('.')
# 使用 zip_longest 函数逐对比较修订号,缺失部分的修订号视为 0
for v1_part, v2_part in zip_longest(v1_parts, v2_parts, fillvalue='0'):
# 将修订号转换为整数并比较
if int(v1_part) > int(v2_part):
return 1
elif int(v1_part) < int(v2_part):
return -1
# 所有修订号都相等
return 0
示例解析
示例 1
输入:
version1="0.1",version2="1.1"version1 = "0.1", version2 = "1.1"version1="0.1",version2="1.1"
过程:
- 将版本号分割为
v1_parts = ['0', '1']和v2_parts = ['1', '1']; - 比较修订号:
0 < 1,返回-1。
示例 2
输入:
version1="1.0.1",version2="1"version1 = "1.0.1", version2 = "1"version1="1.0.1",version2="1"
过程:
- 分割为
v1_parts = ['1', '0', '1']和v2_parts = ['1']; - 使用
zip_longest补全:['1', '0', '1']和['1', '0', '0']; - 比较修订号:
1 == 1,0 == 0,1 > 0,返回1。
示例 3
输入:
version1="7.5.2.4",version2="7.5.3"version1 = "7.5.2.4", version2 = "7.5.3"version1="7.5.2.4",version2="7.5.3"
过程:
- 分割为
v1_parts = ['7', '5', '2', '4']和v2_parts = ['7', '5', '3']; - 使用
zip_longest补全:['7', '5', '2', '4']和['7', '5', '3', '0']; - 比较修订号:
2 < 3,返回-1。
AI 使用
在实现这道题的过程中,MarsCode AI 提供了清晰的解决框架和代码模板:
优势:
-
逻辑清晰:
- AI 建议使用
split和zip_longest,很好地处理了修订号分割和长度补全的问题。 - 代码流程简单明了,易于理解和扩展。
- AI 建议使用
-
细节完善:
- 提到了
fillvalue='0'的处理方法,确保了长度不一致的修订号能正确比较。
- 提到了
-
快速实现:
- AI 能够在短时间内提供可用的代码,实现基本功能,为人工优化提供了良好基础。
不足:
-
边界条件未明确说明:
- AI 提供的代码假设版本号只包含数字,但未明确处理非数字字符或非法输入的情况。
-
缺少效率优化建议:
- 代码中的
zip_longest和逐项比较操作,虽然效率不低,但未提及更高效的替代方案。
- 代码中的
优化建议:
- 输入校验:加入非法输入检查,例如拒绝包含非数字字符的版本号;
- 性能优化:对于超长版本号列表,可考虑提前终止比较的条件。