
 问题:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
要求:
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
OJ代码:
int removeElement(int* nums, int numsSize, int val){
int src=0;
int des=0;
while(src<numsSize)
{
    if(nums[src]!=val)
    {
        nums[des++]=nums[src++];
    }
    else
    {
        ++src;
    }
}
return des;
}
 
解析:
src,des,是数组的两个下标。通过这两个下标的移动来给数组赋值。

假设输入的val是 2
while(src<numsSize) 成立,进入循环
nums[src] ! = val 所以if 条件成立。执行语句 nums[des++] = nums[src++];
也就是把nums[src] 的值赋值给 nums[des];
再进行加一操作。
它会判断现在的src 是否满足循环的条件,如果小于numsSize 则继续进行,
如果不满足条件,就会退出循环。
![由于nums[src]不等于val ,所以两个下标都进行加一操作](https://img-blog.csdnimg.cn/114ab6b68c044f04a0ef7aee53143b87.png)
现在,nums[src] = = val; 进行else 语句
++src; 就是 src 下标进行加一操作,不进行赋值操作。
因为我们的目的就是移除 val 元素,保持des下标不变,最后要返回数组。

 src加一后 nums[src] 就又不等于 val 了,所以继续执行if 语句。
nums[src] 的值赋值给 nums[des];
所以现在 nums[src]的值就是 3
两个下标再进行加一操作。
它会判断现在的src 是否满足循环的条件,如果小于numsSize 则继续进行,
如果不满足条件,就会退出循环。

 现在 nums[src] 又等于 val; 所以进行else 语句。
src 下标进行加一操作,不进行赋值操作。

 加一之后,nums[src] 又还等于 val; 所以还是进行else 语句。

 此时, nums[src] 就不等于 val 了,所以执行if 语句。
nums[src] 的值赋值给 nums[des];
所以nums[des] 的值就是 4 了。
两个下标再进行加一操作。

 nums[src] 又不等于 val 了,所以继续执行if 语句。
nums[src] 的值赋值给 nums[des];
所以现在 nums[src]的值就是 3
此时两个下标再进行加一操作
但是,scr的值会超过numsSize,所以会跳出循环。
然后 return des; 所以现在的数组就是移除val 值后的数组了。


















