本文主要讲解移除元素的要点与细节,按照步骤思考更方便理解
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素。元素的顺序可能发生改变。然后返回nums
中与val
不同的元素的数量。假设
nums
中不等于val
的元素数量为k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。- 返回
k
。
c++与java代码如下,末尾
具体要点:
- 这道题要求我们移除数值等于val的元素,并且是在数组中原地操作,不能使用额外的空间,一提到原地操作,就要想到使用双指针的方法 ,类似题目。
即,当我们删除值为val的元素后,我们就要把后面的元素一个个递补上来,补全空缺的位置
- 既然我们确定使用双指针,那么就要想一下具体使用快慢指针 ,还是左右指针呢?
解决这个问题,我们需要考虑一下每个指针的含义:我们需要一个指针去找元素 ,另一个指针去找位置 ,把找到符合要求的元素 放到正确位置上。以此来实现元素的递补。
所以就要使用快慢指针,其中快指针用来寻找不等于val的元素,慢指针表示递补上来的位置。
当 nums[fast] != val时,就把该元素放到slow位置上
3. 细节问题:
我们需要考虑一下快慢指针的初始化问题,对于初始化,还有其他边界条件,我们可以举个例子
fast到底初始化为0呢,还是1呢?
当fast初始化为0 时,表示循环中要对第一个值进行判断是否等于val
当fast初始化为1 时,表示循环中不对第一个值进行判断是否等于val,我们就要单独判断一下起始位置。
所以综上,尽量还是fast=0
这道题主要就是考察双指针的思路,并不是那么难,只要搞清楚定义出来的两个指针分别的什么含义,代码也就手到擒来。希望我的讲解能有对你有一点帮助
c++代码如下
cpp
#include <vector>
using namespace std;
class Solution{
public:
int removeElement(vector<int>& nums, int val){
int fast = 0, slow = 0;
for (fast = 0;fast < nums.size();fast++) {
//fast代表元素值
//slow代表要放置的位置
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
};
java代码如下:
java
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0, fast = 0;
for (fast = 0; fast < nums.length; fast++) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}