数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
思路:*暴力遍历原数组进行数组元素删除操作*
注意:这道题使用暴力的易错点在于:
我们每次删除完一个元素后i需要从前一个位置开始往后遍历数组,否则会默认第i个下标元素值一定不是val。而事实上我们每个元素都已经往前移动了一位,因此i也需要向前移动一位
内层循环的遍历我们需要注意放置数组越界,因此注意循环条件为j < numsSize -1
// 暴力解法
int removeElement(int* nums, int numsSize, int val)
{
int i =0;
// 遍历原数组找寻数组值等于val的元素的下标
for(i=0;i<numsSize;i++)
{
if(nums[i] == val)
{
// 覆盖删除
int j = i;
for(j = i;j<numsSize-1;j++)
{
nums[j] = nums[j+1];
}
numsSize--;
i--;
}
}
return numsSize;
}
双指针思路节省一层循环
定义快慢指针,快指针寻找不重复的元素,慢指针为我们原地更新的新数组下标,当每次找到一个不重复的元素后我们将快指针指向的元素赋值给慢指针所在位置。
int removeElement(int* nums, int numsSize, int val)
{
if (numsSize > 0)
{
int tmp[numsSize];
int i = 0;
int j = 0;
for (i = 0; i < numsSize; i++)
{
if (nums[i] != val)
{
tmp[j] = nums[i];
j++;
}
}
for (i = 0; i < j; i++)
{
nums[i] = tmp[i];
}
return j;
}
else
{
return 0;
}
}