刪除排序數組中的重複項(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()

 

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