题目地址

解题思路

看到题目,很容易想到利用对象来存储数组中的值为key,然后遍历,看是否存在值,不存在的就是消失的数字。代码如下:

代码

  1. var findDisappearedNumbers = function(nums) {
  2. const obj = {};
  3. for(let num of nums){
  4. obj[num] = obj[num] ? obj[num] + 1 : 1;
  5. }
  6. const n = nums.length;
  7. const res = [];
  8. for(let i = 0;i<n;i++){
  9. if(!obj[i+1]){
  10. res.push(i+1);
  11. }
  12. }
  13. return res;
  14. };

优化

数组的范围在[1,n],正好就是数组的下标-1,遍历数组中的元素,将存在的值赋值为true,然后遍历,值不存在的即为消失的数字。代码如下:

  1. var findDisappearedNumbers1 = function(nums) {
  2. const arr = [];
  3. for(let num of nums){
  4. arr[num-1] = true
  5. }
  6. const n = nums.length;
  7. const res = [];
  8. for(let i = 0;i<n;i++){
  9. if(!arr[i]){
  10. res.push(i+1);
  11. }
  12. }
  13. return res;
  14. };

题解的代码:(有点没太想明白)

  1. var findDisappearedNumbers = function(nums) {
  2. const n = nums.length;
  3. for (const num of nums) {
  4. const x = (num - 1) % n;
  5. nums[x] += n;
  6. }
  7. const ret = [];
  8. for (const [i, num] of nums.entries()) {
  9. if (num <= n) {
  10. ret.push(i + 1);
  11. }
  12. }
  13. return ret;
  14. };