一、分析题目
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也就刚好相等于数组的元素个数