Given an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesnt matter what you leave beyond the new length.
方法1思路
删除的元素真的是没用了,函数完成后我们无法得知原来元素数组的元素构成情况
代码实现
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
if(n == 0)
return 0;
//尾指针的运用,length为已经鉴别过的不等于给定元素的序列的尾元素下标
int length =-1;
for(int i = 0;i < n;i++)
{
if(nums[i] != val)//流式处理,进入循环后先判断,根据判断结果决定要进行的操作
nums[++length] = nums[i];
}
return length+1;
}
};
方法2
思路
即使函数完成了删除操作,我们仍能得知原来数组的元素情况(根据原来数组占用的内存空间位置)将删除的等于给定元素的元素放到数组的右半部分。
代码实现
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
if(n == 0)
return 0;
//i,当前要判断的元素下标(还没判断),0到i-1是已经筛选过的
//由于我们的操作,会将等于给定元素的数组元素放到数组的右边,所以,i扫过的数组元素都是合格的,客观上,i-1的作用
//相当于原来的左尾指针的作用
int i =0;
//right为将等于给定元素的元素放到数组右半部分的左尾下标
int right = n;
while(i < right)
{
if(nums[i] != val)
i++;
else
swap(nums[i],nums[--right]);
}
return i;
}
};