[LeetCode27. 移除元素] | 刷题打卡

205 阅读2分钟

前言

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 春招闯关活动」, 点击查看 [活动详情]