题目描述:
比较两个版本号 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 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。
示例 5:
输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。
解题思路1: 分割+解析,两次遍历,线性空间
- 分别把version1、version2按照 . 字符分割,然后在两个列表后添加0元素,使其列表长度相同
- 遍历两个列表,判断大小
代码1:
class Solution:
def compareVersion(self, version1, version2):
num1 = version1.split('.')
num2 = version2.split('.')
if len(num1) > len(num2):
num2 += (len(num1) - len(num2))*[0]
elif len(num1) < len(num2):
num1 += (len(num2) - len(num1))*[0]
for i in range(len(num1)):
if int(num1[i]) > int(num2[i]): # int是为了比较"01"与"1"的大小
return 1
elif int(num1[i]) < int(num2[i]):
return -1
return 0
s = Solution()
version1 = "1.01.1"
version2 = "1.1"
print(s.compareVersion(version1, version2))
由于以上代码是先将长度等效,然后依次遍历进行的比较。因此,为了提升代码的效率,我们先逐一进行元素比较,当长度不同时,再添加0元素。
class Solution:
def compareVersion(self, version1, version2):
nums1 = version1.split('.')
nums2 = version2.split('.')
n1, n2 = len(nums1), len(nums2)
for i in range(max(n1, n2)):
i1 = int(nums1[i]) if i < n1 else 0
i2 = int(nums2[i]) if i < n2 else 0
if i1 != i2:
return 1 if i1 > i2 else -1
return 0
解题思路2:
来源于:LeetCode
上述方法有两个缺点:
- 是两次遍历的解决方法。
- 消耗线性空间。
我们能否实现一个只有一次遍历和消耗常数空间的解决方法呢?
其思想是在每个字符串上使用两个指针,跟踪每个数组的开始和结束。
这样,可以并行地沿着两个字符串移动,检索并比较相应的块。一旦两个字符串都被解析,比较也就完成了。
代码2:
class Solution:
def get_next_chunk(self, version, n, p):
# if pointer is set to the end of string
# return 0
if p > n - 1:
return 0, p
# find the end of chunk
p_end = p
while p_end < n and version[p_end] != '.':
p_end += 1
# retrieve the chunk
i = int(version[p:p_end]) if p_end != n - 1 else int(version[p:n])
# find the beginning of next chunk
p = p_end + 1
return i, p
def compareVersion(self, version1, version2):
p1 = p2 = 0
n1, n2 = len(version1), len(version2)
while p1 < n1 or p2 < n2:
i1, p1 = self.get_next_chunk(version1, n1, p1)
i2, p2 = self.get_next_chunk(version2, n2, p2)
if i1 != i2:
return 1 if i1 > i2 else -1
return 0
s = Solution()
version1 = "1.01.1"
version2 = "1.1"
print(s.compareVersion(version1, version2))
参考链接:
题目来源: