LeetCode算法题 (移除元素)Day1!!!C/C++

一、分析题目

1、拿到题目首先分析需求,由题目可知给一个数组(nums)和一个值(val),要求原地移除所有数值等于val的元素 并返回nums数组中与val不同的元素数量,也就是返回移除元素后的数组长度。注:这里原地移除的意思就是,不借助第二个数组进行移除操作!

2、通过上步的分析我们得知需要在本数组内进行移除nums中与val相同元素的操作,这里我们要实现此功能就需要用到双指针|双下标法

本题题目为接口型OJ题型(接口型通俗的来讲就是只需要完成这项功能,只需要编写函数体内部的代码,不需要编写主函数部分)

二、分析形参

拿到类似题型首先我们要分析函数的形参分别是什么,这是很关键的一步,如果拿到了函数,看不懂每个形参是什么意思,那么这种题型我们也就无从下手了。

分析:

1、首先第一个形参是一个指针,它指向了一个int类型,通过这里我们可以得出nums为数组。

2、第二个形参是一个int类型,命名为numsSize,这里就直接见名知意了,numsSize为数组的大小。

tips:大家在编写程序的时候也要养成良好的书写习惯,变量的命名尽可能的做到见名知意,增加代码的可读性

3、最后一个形参也是int类型,命名为val,题目中也已经给了,它是要移除的元素。

经过上述的分析我们就可以更高效的编写代码了

三、代码实现

这里我用到的方法是下标法

这道题的核心点在于if语句是怎么实现原地移除元素

题目给出要移除掉与val相同的元素,这样一想可能会比较麻烦,那咱们换一种思路,逆着推。我们是不是可以当作成如果nums元素与val不相同,我们就保留这个元素。

这样一想是不是就突然发现问题就没那么复杂了

通过上述的分析,如果想要实现的话那么就需要用到if语句。

这一步我们只需要将标红部分转换成c代码就欧克了!

if(nums[src]!=val)
{
    //我们要把这个元素原封不动的继续存储下来
}

if的判断条件写完了,那么if内的语句应该怎么编写呢?

这也就用到了我在开头时和大家说的双下标法了

我们首先需要定义两个变量

int src = 0;//src为遍历数组时需要用到的数组下标
int dst = 0;//dst为需要存储与val元素不同的数组下标

那么我们就可以再给if语句里填写如下代码

if(nums[src]!=val)
{
    nums[dst++]=nums[src];
}

这句的意思就是如果我当前的数组元素不等于val的话,我就把这个元素存放到为dst的下标 

以下是代码的所有部分

int removeElement(int* nums, int numsSize, int val) {
    int src=0;//src为遍历数组要用到的下标
    int dst=0;
    while(src<numsSize)//src要小于numsSize也就是遍历到numsSize-1的位置
    {
        if(nums[src]!=val)
        {
            nums[dst++]=nums[src];
        }
        src++;
    }
    return dst;//最后返回dst
}

最后return dst,dst也就刚好相等于数组的元素个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值