删除排序数组中的重复项(python中变量作用域详解)

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1,2

你不需要考虑数组中超出新长度后面的元素。

示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0,1,2,3,4

你不需要考虑数组中超出新长度后面的元素。

写在前面:

在写这道题的时候,一直没理解题的意思,所以就最先开始一直提交错误,题中让返回的是数组的长度,并不是数组,还有关于python中函数的变量作用域问题,后面慢慢列出!

先列出这道题的正确解法:

class Solution:
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        k=0
        for i in range(1,len(nums)):
            if nums[i] != nums[k]:
                k+=1
                nums[k] = nums[i]
        
        del nums[k+1:len(nums)]
        return len(nums)

这道题难度并不难,python中解法我观察了用时少的,解法都大致相同。

现在我贴一贴我当时写的错误解法,并且分析错误原因

class Solution:
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        if n == 0:
            return 0
        last_nums = nums[n-1]
        nums = [nums[i] for i in range(0,n-1) if nums[i] != nums[i+1]]
        nums.append(last_nums)
        return len(nums)

这里如果打印输出的nums是实现了对列表中重复数组的去除的,但是在原题题交中一直不能过,分析后原因是:

        函数中有自己的变量作用域空间,在代码的后面又申请了作用域空间nums,但是对与函数中传进来的nums没有做任何改变,所以在提交后返回结果时,返回的是未做改变的nums,所以提交一直过不了。但是后面我对函数内部的变量声名global和nonlocal时,还是提交不了,现在对python中的global和nonlocal做进一步的解释。


python中的global和nonlocal

global:

         global用于在函数或者其他作用域中使用全局变量,如果不对全局变量做出修改,则可以不使用global。在局部对全局变量做出修改的时候就要声名全局变量,这样就可以对全局变量在一个作用域里做出修改。

test = 0
 
def global_test():
    global  test
    test+=1
    print (test)
global_test()

         这样就能对test值在函数里做出修改。

nonlocal:

         nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。这里用的是在函数式编程中用nonlocal,可以避免使用全局变量。

def make_counter(): 
    count = 0 
    def counter(): 
        nonlocal count 
        count += 1 
        return count 
    return counter 
       
def make_counter_test(): 
  mc = make_counter() 
  print(mc())
  print(mc())
  print(mc())
 
make_counter_test()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章