代码随想录-数组-移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

你不需要考虑数组中超出新长度后面的元素

思路

暴力解法

从数组中查找指定值的元素,很容易想到遍历依次去比较元素的值,查找到目标元素后要移除该元素,并且要求原地修改输入数组,则不能直接删除该元素,而是需要该元素后的所有元素依次替代原有值,从而得到移除元素的效果。

因此需要两层for循环,外层for循环用于查找要被删除的元素,内层for循环用于将后面元素都往前移一位以覆盖要被删除的元素,更新数组。最后返回新数组的长度。因此我们可以将数组长度设为一个单独的变量,方便对其进行操作。

js 复制代码
function remove(nums,target){
    let len = nums.length
    // 外层for循环,查询目标元素
    for(let i =0; i < len; i++){
        if(nums[i] == target){
            // 查询到要删除的元素,开始遍历后面元素,依次覆盖之前元素,更新数组
            // 要使用下标为j++的元素覆盖下标为j的元素,j++为最后一个元素下标时为len-1;则j的最大值应该小于len-1
            for(let j = i; j < len - 1; j++){
                // 使用后一个元素覆盖前面元素的值
                nums[j] == nums[j++]
            }
            // 一个元素被移除(覆盖),则数组总长度应减一
            len --;
            // 目标元素被后面元素所覆盖,当下一次查询时应该还从当前元素开始查询,需要判断覆盖之后的元素是否为要删除的目标元素,所以i要减1,确保for循环i++后下次循环开始时i还指向被覆盖的元素
            i --;
        }
    }
    // 每次移除元素len都会减1,则len为移除所有目标元素后的数组长度
    return len;
}

双指针法(快慢指针)

快慢指针法:使用一个快指针一个慢指针在一个for循环中完成两个for循环的工作。

快指针:进行遍历,指向当前遍历到的元素的下标,用快指针判断是否为要移除的目标元素

慢指针:在遍历过程中指向新数组当前要更新的元素的下标。

js 复制代码
function remove(nums,target){
    let slow = 0;
    for(let fast = 0; fast < nums.length; fast ++){
        // 如果当前元素为要移除的目标元素,则slow指针不移动,fast指针后移,等待下一个fast指向的元素不为目标元素时,将fast指向的元素的值赋给slow指针指向的元素,并将slow后移一步
        if(nums[fast] !== target){
            nums[slow++] = nums[fast]
        }
    }
    // 每次更新元素后(将当然不是目标元素的值赋给slow指向的元素),slow都会被+1,对应更新后数组的长度,可以直接返回
    return slow;
}
相关推荐
给月亮点灯|7 分钟前
Vue基础知识-脚手架开发-使用Axios发送异步请求+代理服务器解决前后端分离项目的跨域问题
前端·javascript·vue.js
叫我阿柒啊9 分钟前
从Java全栈到前端框架:一次真实的面试对话与技术解析
java·javascript·typescript·vue·springboot·react·前端开发
多打代码34 分钟前
2025.09.05 用队列实现栈 & 有效的括号 & 删除字符串中的所有相邻重复项
python·算法
张迅之40 分钟前
【React】Ant Design 5.x 实现tabs圆角及反圆角效果
前端·react.js·ant-design
@CLoudbays_Martin1141 分钟前
为什么动态视频业务内容不可以被CDN静态缓存?
java·运维·服务器·javascript·网络·python·php
蔗理苦2 小时前
2025-09-05 CSS3——盒子模型
前端·css·css3
j_xxx404_2 小时前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺2 小时前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
THMAIL3 小时前
深度学习从入门到精通 - 神经网络核心原理:从生物神经元到数学模型蜕变
人工智能·python·深度学习·神经网络·算法·机器学习·逻辑回归
二川bro3 小时前
第25节:VR基础与WebXR API入门
前端·3d·vr·threejs