给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 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()