题干懒人包
给定一个排列好的列表,将它整理成重複项最多出现两次,比方说以下
[1,1,1,2,2,3] -> [1,1,2,2,3, ...]
最后回传整理完成的数量,比方说上面会回传 5 (1, 1, 2, 2, 3)。
最后以下几点要注意
只能修改该数组,利用的空间複杂度最多为1(意思就是不能创建新的数组append值)
不用管超过回传值以后nums的值
"""比方说输入的 nums = [0,0,1,1,1,1,2,3,3]那最后回传值要等于7,且 nums[:7] 要等于 [0,0,1,1,2,3,3]"""
解法
用 head 纪录当前元素,tmp纪录元素重複几次,接下来迴圈开始比较当前值与下一个值,
如果当前元素不等于遍历到的数值,head += 1 ,并在下标为 head 的地方存放元素,并将tmp设定成0(因为tmp要重置不然之后无法纪录重複有无发生)当元素相同时,优先查看 tmp 是否为0,如果是的话代表该元素上一个没出现过,head += 1 ,并在下标为 head 的地方存放元素,并将 tmp += 1最后返回 head + 1 (因为head是下标值,非长度)
def removeDuplicates(self, nums) -> int: head = 0 tmp = 0 for i in range(1, len(nums)): if nums[i] != nums[head]: head += 1 tmp = 0 nums[head] = nums[i] else: if tmp == 0: head += 1 tmp += 1 nums[head] = nums[i] return head + 1