【数据结构】C语言练习题----利用“双指针”的思想来移除元素

题目链接:

原地移除数组中所有的元素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 所对应的位置的元素与是否为题目中要求删除的元素比较

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值