批话少说,上题:
比较两个版本号 version1 和 version2。
如果version1 > version2
返回1
,如果version1 < version2
返回-1
, 除此之外返回0
。你可以假设版本字符串非空,并且只包含数字和
.
字符。
.
字符不代表小数点,而是用于分隔数字序列。例如,
2.5
不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。你可以假设版本号的每一级的默认修订版号为
0
。例如,版本号3.4
的第一级(大版本)和第二级(小版本)修订号分别为3
和4
。其第三级和第四级修订号均为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 version2
示例 5:
输入:version1 version2 version1
提示:
- 版本字符串由以点 (
.
) 分隔的数字字符串组成。这个数字字符串可能有前导零。- 版本字符串不以点开始或结束,并且其中不会有两个连续的点。
这题其实对Python来说不难,有split()方法就解决了一半了。
方法一:用split('.')分离字符串后,创建字典,根据长度的赋予不同的值保证长度相同,再逐一比较。
解析:简单来说,因为版本号的限制问题,如果将点去掉再分开放入列表,其长度最多只有4,我们只要提前设置一个字典去寄存所有长度需要补充的值(如长度是1的话就要补充3个"0"进去,即:l = {1:['0','0','0'],2:['0','0'],3:['0']}),之后再根据列表的长度补充进去,使两个字符串转列表的数据长度相等就行,然后就很好比较了。
代码:
class Solution:
def compareVersion(self, version1: str, version2: str) -> int:
version1 = version1.split('.')
version2 = version2.split('.')
l = {1:['0','0','0'],2:['0','0'],3:['0']}
lv1 = len(version1)
lv2 = len(version2)
if lv1 < 4:
version1.extend(l[lv1])
if lv2 < 4:
version2.extend(l[lv2])
if version1 == version2:
return 0
for v1,v2 in zip(version1,version2):
if int(v1) < int(v2):
return -1
if int(v1) > int(v2):
return 1
return 0
方法二:
方法二是我在力扣里面的大佬看到的解法:https://leetcode-cn.com/problems/compare-version-numbers/comments/80062
在学习方法二之前要先了解一下Python的内置方法any():
any(iterable):
iterable: 可迭代对象,参数不可为空,但iterable可空。
返回值: <class 'bool'> True 或 False。
函数说明:当 iterable 中有元素为 True 时,则返回 True 。如果当 iterable 为空时,返回 False 。
从官方文档中,我们可以得知, any(iterable)与这段代码等价:
def any(iterable):
for element in iterable:
if element:
return True
return False
具体可以看这个链接:
简单来说就是可以判断对象里面是否还存在元素(之后会解释),哪个列表还有元素哪个就比较大。
解析:简单来说就是用split('.')分离后,挨个弹出第一个字符并进行比较,然后利用any()方法检测是否还有列表有剩余的元素,谁有谁就是爸爸,就返回对应的结果。
代码:
class Solution:
def compareVersion(self, version1: str, version2: str) -> int:
if version1 == version2:
return 0
version1 = [int(x) for x in version1.split('.')]
version2 = [int(x) for x in version2.split('.')]
while version1 and version2:
x,y = version1.pop(0),version2.pop(0)
if x < y:
return -1
if x > y:
return 1
#version1或version2不完整:
if version1 and any(x > 0 for x in version1):
return 1
if version2 and any(x > 0 for x in version2):
return -1
return 0