1.自己的做法
早上开始刷题,在第一题上,一开始想的是用for循环来进行删除操作,可是没想出来,于是后来想到了用while循环。题意中说的是
你不需要考虑数组中超出新长度后面的元素
我理解的意思是把那些重复的数字都移到数组的最后,然后数组前面的项便均是非重复项。但是我在写代码的时候直接把重复的项给删除了,代码如下:
nums = [0,0,1,1,1,2,2,3,3,4]
i = 0
leng = len(nums)
while(i<leng):
j = i+1
while(j<leng):
if nums[j] == nums[i]:
del nums[j]
#此处是因为我们将重复项删除了,那么j的取值范围也要变化,不然取值就超过范围
leng = leng-1
#此处是为了防止出现多个连在一起的重复项
j = j - 1
j = j + 1
i = i+1
print(nums)
nums[i]为被比较项,nums[j]为比较项。
这个程序在Leetcode上提交后通过测试的费时比较大,但是对于[0,1,0,1,0]这种间断性重复项的数组也有效。如下所示
所以下一步就是在保证现有效果的基础上,减少运行时间。
2. 根据leetcode的解答,我又写了如下的代码
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if (len(nums)==0):
return 0
i = 0
for j in range(i+1,len(nums)):
if nums[j] != nums[i]:
i += 1
nums[i] = nums[j]
return i+1
运行时间很短,如下
但是可以看出,对于非连续的重复项,这个程序就无能为力了。