提示:看到这个题目,看起来很简单但是写起来很的好考验基本功
目录
前言
一、算法题目
二、思路
三、暴力解法
总结
前言
数组移除元素 相信很多人看到这个题目就感觉好简单哦不就删除就完事了其实不然,是覆盖掉要移除的元素,说到这里我相信人们已经有了大概的想法,那么接下来我给大家讲解一下这道题。
提示:以下是本篇文章正文内容,下面案例可供参考
一、算法题目
给你一个数组 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循环,这个就是暴力实现的大体思想。
要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
三、暴力解法
var removeElement = function(nums, val) {
let k=0;
for(let i=0;i<nums.length;i++){
if(nums[i]!=val){
nums[k++]=nums[i]
}
}
return k;
};
这个题目暴力的解法就是两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。
总结
其实还有一个双指针的解法,双指针解法更规范一些,我还没有理解太透彻就没更新出来。
这个题真的很考验对于数组的基本功,希望看完这一篇文章对你有帮助。