栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【数据结构】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 所对应的位置的元素与是否为题目中要求删除的元素比较

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832593.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号