- 题目链接:https://leetcode.com/problems/remove-element/solution/
- 题目概述:这道题让我们在一个数组里删除指定的元素,并返回删除元素后的数组长度n,并且数组前n个长度不包含指定删除的元素
- 题目要求:
- 原地操作
- 不分配额外空间
- 不关心返回的数组元素顺序
- 解法
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
n = len(nums)
if n == 1 and nums[0] == val:
return 0
p = n-1
q = p+1
while p >= 0 and q >= 0:
while p >= 0 and nums[p] == val:
p -= 1
q = p - 1 if q >= p else q - 1
while q >= 0 and nums[q] != val:
q -= 1
if q >= 0:
nums[p] ^= nums[q]
nums[q] ^= nums[p]
nums[p] ^= nums[q]
return p+1
描述:使用双指针法,因为最后要返回数组长度,所以思路是将后面的非指定元素交换到前面指定元素的位置
- p从尾部向头部移动,遇到指定元素即停止
- q从p前面开始向头部移动,遇到非指定元素即停止
- 原地交换p、q指向的元素