我有一个非常简单的算法问题here,它要求从列表中删除重复项并返回新列表的长度。
这是py3
中的代码:
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums = list(set(nums))
return len(nums)
当我在终端上测试时,这很好用。但是根据leetCode,输入:[1,1,2]
会输出[1,1]
而不是[1,2]
。假设leetCode没有错误,我只能得出结论nums
的范围正在发生?使用nums
设置时,nums = list(set(nums))
可能会被视为局部变量吗?
答案 0 :(得分:0)
我无法在您关联的网络上测试代码。但我认为您可以将测试用例想象如下(我只是在这里猜测,所以这个答案可能无法正常运行):
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums = list(set(nums))
return len(nums)
nums = [1, 1, 2]
solver = Solution()
length = solver.removeDuplicates(nums)
print(nums[:length])
因此,通过观察测试用例,您可以看到实际获得[1, 1]
,因为您没有修改列表,但是您正在方法范围内创建新的局部变量。你可以尝试做这样的事情:
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
i = 0
while i < len(nums) - 1:
if nums[i] == nums[i+1]:
del nums[i]
else:
i += 1
return len(nums)
nums = [1, 1, 2, 2, 2, 3]
solver = Solution()
length = solver.removeDuplicates(nums)
print(nums[:length])
当他们要求“就地”算法时,你不应该创建新变量(或用新列表覆盖旧变量),那不是O(1)额外内存,它是O(n),因为你正在创建一个新副本。
编辑更多解释
您的代码发生了什么,是您在新的内存空间中创建一个新的局部变量(如果您了解计算机,则在堆栈中创建它)因此,在您的函数内部,您将丢失对指针的引用它给你outum nums变量(原始列表)。因此,函数(堆栈)中的nums变量被设置为通过迭代原始列表的所有不同元素而创建的列表。然后,您真正得到满足所有要求的副本并存储在堆栈中,但旧列表保持不变。然后,当您退出函数时,堆栈变量将丢失,因此当您访问num
变量时,您将获得旧变量(原始变量)。