?
?本题运用了快慢指针法来解决,实际上并没有创建指针,而是创建了两个变量模拟下标的走势:
?两个变量的规则是:
str是快指针,dst是慢指针,str遍历数组,dst用于改变数组的值和返回非val的个数;
如果str指向的值等于val,str++;
如果str指向的值不等于val,就使nums[dst] = nums[str],然后str++,dst++;
直到str不再小于numsSize,即str等于numsSize,超出了nums的下标范围,结束str的遍历;
这样做的目的是,str遇到val值时,会直接跳过,dst将在原地待命,直到str后面遇到非val值时,再用dst将其覆盖,最终str遍历完毕,dst即为非val值的个数,由于dst <= numsSize,所以返回dst后可以根据dst创建循环的判断条件,打印出把val值覆盖之后的数组。
?
int removeElement(int* nums, int numsSize, int val) {
int str = 0;
int dst = 0;
while(str < numSize)
{
if(nums[str] == val)
{
str++;
}
else
{
nums[dst++] = nums[str++];
}
}
return dst;
}