使用语言: python
刷题顺序:https://medium.com/@yjiao7/1-leetcode-%E5%88%86%E7%B1%BB%E9%A1%BA%E5%BA%8F%E8%A1%A8%E7%AC%AC%E4%BA%8C%E7%89%88-%E5%A2%9E%E5%8A%A0%E9%87%8D%E7%82%B9250%E9%A2%98-bbf97a646edc
题目:解题: 题目要求给出一个修改后的list,使得list的前n个元素满足单种元素最多重复一次的要求。
思路:将list想成两部分,一部分是处理后的,一部分是未处理的。不断寻找符合要求的元素,每找到一个就将其放在处理后的那段的末尾。
原始代码:64ms ,13.8 MB。为什么那么慢呢?
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
l = len(nums)
if l < 3:
return l
else:
next = 2
for i in range(2,l):
if nums[i] != nums[next - 2]:
nums[next] = nums[i]
next += 1
return next
修改后的代码:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
next = 2
l = len(nums)
for i in range(2,l):
if nums[i] != nums[next - 2]:
nums[next] = nums[i]
next += 1
return min(next, l)
虽然并没有改变速度,但是更加美观。就算len(nums) < 3也不会报错,因为range函数的第二个参数小于第一个时,for loop不会执行
for loop 还有以下特性:
a = [1,2,3]
for i in a:
print(i)
print(a)
a.pop(0)
-->
1
[1, 2, 3]
3
[2, 3]
I的取值是每次循环时按a的index来取的。
另一种思路:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
Next = 2
i = 2
while i < len(nums):
if nums[i] == nums[Next-2]:
del nums[i]
else:
Next += 1
i += 1
return min(Next,len(nums))