目录
题目解读
通过题目,我们大致了解到是要在原数组的基础上将前k个元素中等于val的元素删除,然后再将其他的元素移到前面,对这k个元素的顺序不做要求,k个元素后面的元素也不做要求
解题思路
因为不能够创造新的数组,所以 我们考虑双“指针”法。具体的操作如下
如图,我们定义了两个整型变量用来表示数组的下标,src用来查找val元素,dst用来记录val元素的位置,方便我们后期对其进行覆盖。
开始时我们让src和dst都指向第一个数组元素,如果nums【src】==val,我们就跳到下一个元素,dst保持不变 ,直到遇到第一个不等于val的元素时,我们就num[dst]=nums[src].直到src超过数组元素的范围。由此可以我们需要写一个循环来遍历这个数组
注意:无论src是否等于val它都要向后走也就是src++,而dst只有当nums[dst]经过重新赋值后才++
例:假如val=4,则经过一次循环后,应该变成这样
代码分析
如图,这里我们利用removeElement函数实现上述功能,返回值dst即为k的值,numsSize表示数组的大小。
int removeElement(int* nums, int numsSize, int val) {
//使用双指针法(这里指针指的是下标)
int src=0;
int dst=0;
while(src<numsSize)
{
//当src指向val时,src++,将src指向的值再赋给nums[dst]
if(nums[src]==val)
{
src++;
}
else
{
nums[dst++]=nums[src++];
}
}
return dst;
}