给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
本题需要原地删除跟 val 值相等的元素。如果我们按照 顺序表 的思想,遍历数组,找到符合条件的元素就删除,并且把后面的元素全部都往前提,遍历多次结束。

如果按上述方法做的话,就浪费时间了!
为了节省时间,我将采用双指针的形式来做这道题,如下图

如果sign指向位置的元素不等于 val,那就把 sign 位置上的元素赋值给 record 位置上的元素,record++,sign++。
因为前三个元素都不等于 val ,我们也可以看做他们什么也没干,直到 sign 指向位置元素等于val

当 sign 指向位置元素等于 val 时,record 就保持不动,sign 继续前进直到所指向元素不满足条件,这时赋值的效果就显现出来了。之后两个指针向后移动,一直赋值就实现原地删除元素效果啦

因为是先赋值然后 record++,所以最后 record 的值就等于数组的长度,所以我们可以直接返回record
- class Solution {
- public int removeElement(int[] nums, int val) {
- int n = nums.length;
- int sign = 0;
- int record = 0;
- for(; sign < n;sign++){
- if(nums[sign]!=val){
- nums[record] = nums[sign];
- record++;
- }
- }
- return record;
- }
- }