题目链接:
原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。
力扣https://leetcode-cn.com/problems/remove-element/
解题思路:
代码实现:
int removeElement(int* nums, int numsSize, int val)
{
int up = 0,down = 0;
while (up < numsSize) //注意这里是up,而不是down
{
if (nums[up] != val)
{
nums[down] = nums[up];//等号左右俩端的顺序不能颠倒
up++;
down++;
}
else
{
up++;
}
}
printf ("%d,",down);
for(int i = 0;i < down;i++)
{
printf("%d",nums[i]);
}
return down;
}
注意点:
1. nums [ down ] = nums [up] ; 这一行代码的意思是达到精准覆盖删去数据后的位置,
当 nums [up] != val 时,二者相等并无影响,而一旦相等,就会执行 up++; 语句,
从而覆盖因为被删除了的元素而留下来的空位,的功能就由 nums [ down ] = nums [up] ; 来实现
nums [ down ] = nums [up] ;与 up++; down++ 的前后位置也不能颠倒,
如果颠倒的话,当准备要覆盖元素的时候 ,却又往后移动了一个位置才覆盖,从而造成一个空位的存在
2. while (up < numsSize) 是表示执行多少次比较,这里一定不能是 down < numsSize ,
因为是删除元素,相对于up遍历过的位置来说,down 比 up 遍历过的位置少,就不能删除全部要删除的元素
而且是 up 所对应的位置的元素与是否为题目中要求删除的元素比较