[打卡11:leetcode27. 移除元素] |刷题打卡

257 阅读2分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

前言

第一次参加掘金打卡活动,别的不说 主要是奔着奖励来的。4.12开始为了达到14题小目标 冲冲冲!!!这是第11题。

image.png

题目描述

题目链接:移除元素

题目描述我用截图leetcode的为主,所以题目如下图

image.png

思路分析

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

我当时就想用splice去除等于val的值, 去除的位置和indexOf出来的相对应,感觉不难直接开敲。

image.png 有点意外怎么会不对呢,而且结果也很意外,然后在浏览器下运行结果如下,也是没问题的

image.png 重新看了一遍题目:发现 并返回移除后数组的新长度 这句话,那就修改成返回数组长度return nums.length,提交如下

image.png

好的测试通过,不过说真这里提交错误的提示信息有点误导人 感觉提示信息不是很友好。

因为重新看了题目:发现这句话元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素 让我又有了个新思路,遍历nums,然后用一个i去记录不等于val的个数,最后返回i

image.png 那么问题来了 现在nums会是什么呢, 这时候的nums和刚刚第一种的方法的nums会一样吗 ?

聪明的你肯定知道答案:不一样,比如第一种方法返回arr,那么第二种方法则是[...arr,...arr1]这里的arr1这是原数组nums的后半截,返回的数组和原数组长度一样,第二种方法很符合刚刚那句提示,数组顺序可以改变,不需要考虑超出长度后面的元素,也是这句话启发了我这样去解。

AC 代码

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
// 第一种方法
var removeElement = function(nums, val) {
    if(!nums.length){
        return 0
    }
    let index=nums.indexOf(val)
    while(index!=-1){
        nums.splice(index,1)
        index = nums.indexOf(val)
    }
    return nums.length
};
// 第二种方法
var removeElement = function(nums, val) {
    if(!nums.length){
        return 0
    }
    let i = 0;
    for(let j =0;j<nums.length;j++){
        if(nums[j]!=val){
            nums[i]=nums[j]
            i++
        }
    }
    return i
};

总结

坚持就是胜利。第11题算法完成,坚持就是胜利!!!

       ↓↓↓

算法系列链接

       ↑↑↑

这里可以点!这里可以点!这里可以点!