掘金团队号上线,助你 Offer 临门! 点击 查看详情 (opens new window)
# 前言
第一次参加掘金打卡活动,别的不说 主要是奔着奖励来的。4.12开始为了达到14题小目标 冲冲冲!!!这是第11题。
# 题目描述
题目描述我用截图leetcode的为主,所以题目如下图
# 思路分析
看见题目提示不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
我当时就想用splice去除等于val的值, 去除的位置和indexOf出来的相对应,感觉不难直接开敲。
有点意外怎么会不对呢,而且结果也很意外,然后在浏览器下运行结果如下,也是没问题的
重新看了一遍题目:发现
并返回移除后数组的新长度
这句话,那就修改成返回数组长度return nums.length
,提交如下
好的测试通过,不过说真这里提交错误的提示信息有点误导人 感觉提示信息不是很友好。
因为重新看了题目:发现这句话元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素
让我又有了个新思路,遍历nums,然后用一个i去记录不等于val的个数,最后返回i
那么问题来了 现在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
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 总结
坚持就是胜利。第11题算法完成,坚持就是胜利!!!
↓↓↓
↑↑↑
这里可以点!这里可以点!这里可以点!