简单的python leetCode在技术性上不被接受?

时间:2018-03-02 15:09:40

标签: python

我有一个非常简单的算法问题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))可能会被视为局部变量吗?

1 个答案:

答案 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变量时,您将获得旧变量(原始变量)。

要了解这里发生了什么,您可以阅读this以了解范围,并this了解如何将参数传递给函数。