解题思路
看到题目,很容易想到利用对象来存储数组中的值为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;};
