LeetCode 27 移除元素
题目描述
给定一个数列nums
和数值val
,消除数列nums
中与数值 val
相同的元素,最终返回新数列的长度;要求:不能开辟空间分配新的数列,必须改变原输入nums
数列;并对修改后的nums
数列的元素顺序没有要求,可以被修改。
Examples
nums=[3,2,2,3
;val=3
则返回长度为2;nums=[0,1,2,2,3,0,4,2]
;val=2
则返回长度为5;
其实这道题目与#26消除重复元素差不多,本题指定了消除的元素;不同点在于:首先要判断val
是否一定在nums
内,这一点与消除重复元素不同——一定在其中。
参考实现
方式1
class Solution: def removeElement(self, nums: List[int], val: int) -> int: if val not in nums: #如果不存在指定元素,直接返回数组长度 return len(nums) else: i = 0 while i < len(nums): #找到指定元素 if val == nums[i]: #移除指定元素 nums.pop(i) else: #循环条件 + 1 i += 1 return i
方式2
def removeElement_02(nums: List[int], val: int): nums[:] = [n for n in nums if n != val] return len(nums)
这里借助推导式实现,简洁多看两遍也能理解;
Java 版本
双指针解法
public static int removeElement01(int[] nums, int val) { //声明左右指针 int left = 0, right = nums.length - 1; while (left < right) { if (nums[left] == val) { nums[left] = nums[right--]; } else { left++; } } return left; }
通用解法
public static int removeElement(int[] nums, int val) { int index = 0; for (int num : nums) { if (num != val) { nums[index++] = num; } } return index; }