前言
21春招已经开始了,春招更加能鼓舞我不停的学习,算法是面试中非常重要的一环,我们想要每天刷题,但是又怕刷完就忘记,写文章就是很好的办法,坚持每天刷题打卡,冲就完事了。今天刷的是一道 简单 数组题。
一、题目描述:
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
二、思路分析:
看到这个题目,我的第一想法是用JavaScript里面数组的API:array.splice() 可以直接修改原数组。
当我们调用nums.splice(i,1) 将从第i个元素开始,删除一个元素。 具体代码在下面第一段
但我们刷的是一道算法题,这样写没有什么意义。想到了第二种方法,数组覆盖,用逆向思维,将数组nums中和给定的值val 不相等的做判断,覆盖掉值相等的元素,只需要添加一个变量做新的下标就可以实现了。具体代码在下面第二段
三、AC 代码:
(1)
var removeElement = function(nums, val) {
for(var i=0;i<nums.length;i++){
if(nums[i]==val){
nums.splice(i,1)
i-- //这一步很重要 删除当前元素,后面的元素下标都会前移,如果没有这一步,将会减少一个元素的检验
}
}
return nums.length
};
(2)
var removeElement = function(nums, val) {
var a=0;
for(var i=0;i<nums.length;i++){
if(nums[i]!=val){
nums[a]=nums[i]
a++
}
}
return a
};
四、总结:
虽然使用JavaScript中的API也能实现这道题目,但是没有起到刷算法题的意义。这个题目中用数组覆盖的思路写时,不能将原来的整个数组长度输出,这时候应该想到添加一个变量做数组下标,就可以输出覆盖后的数组长度了。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 [活动详情]