給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 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()