解题思路
看到题目,很容易想到利用对象来存储数组中的值为key,然后遍历,看是否存在值,不存在的就是消失的数字。代码如下:
代码
var findDisappearedNumbers = function(nums) {
const obj = {};
for(let num of nums){
obj[num] = obj[num] ? obj[num] + 1 : 1;
}
const n = nums.length;
const res = [];
for(let i = 0;i<n;i++){
if(!obj[i+1]){
res.push(i+1);
}
}
return res;
};
优化
数组的范围在[1,n],正好就是数组的下标-1,遍历数组中的元素,将存在的值赋值为true,然后遍历,值不存在的即为消失的数字。代码如下:
var findDisappearedNumbers1 = function(nums) {
const arr = [];
for(let num of nums){
arr[num-1] = true
}
const n = nums.length;
const res = [];
for(let i = 0;i<n;i++){
if(!arr[i]){
res.push(i+1);
}
}
return res;
};
题解的代码:(有点没太想明白)
var findDisappearedNumbers = function(nums) {
const n = nums.length;
for (const num of nums) {
const x = (num - 1) % n;
nums[x] += n;
}
const ret = [];
for (const [i, num] of nums.entries()) {
if (num <= n) {
ret.push(i + 1);
}
}
return ret;
};