【Leetcode】448. Find All Numbers Disappeared in an Array

1768 ワード

タイトルは以下の通りです.
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements of [1, n] inclusive that do not appear in this array.
Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
Example:

  
  
  
  
Input: [4,3,2,7,8,2,3,1] Output: [5,6]

整数配列numsが与えられ、配列内の各要素の値範囲は[1,nums.length]であり、ある要素は2回、ある要素は1回現れる.[1,nums.length]の範囲で配列に現れていない数値を返す必要があります.
解法解析:条件を満たす配列(連続自然数)において、配列要素が小さい順から大きい順に配列されている場合、配列中の各項目とそのキーの関係は、i+1=arr[i]である.この配列は順序に関係なく存在するため,乱序条件下ではこの関係は依然として存在する.したがって、配列は2回遍歴され、1回目の遍歴は、各項目の値がi+1=arr[i]の関係でその値がソート状態で対応するキーを見つけ、そのキーに対応する配列項目を負の値にする.2回目のループは、各項目が負であるか否かに基づいて結果を出すことができ、負でない場合、キー値+1の値が元の配列に現れないことを示す.
function findDisappearedNumbers(nums) {
    var res = [],
        length = nums.length;
    
    for(var i = 0; i < length;i++){
        var m = Math.abs(nums[i]) - 1;  //       ,                    ,            。
        nums[m] = nums[m] > 0 ? -nums[m] : nums[m];
    }
    for(var j = 0;j < length;j++){
        if(nums[j] >= 0) res.push(j + 1);
    }
    
    return res;
};

最初は文字列で解决する方法も考えましたが、皆さん笑ってください....
function findDisappearedNumbers(nums) {
    var length = nums.length,
        numStr = ","+ nums.join(",")+",",
        res = [];
        
    for(var i = 1;i <= length;i++){
        if(numStr.indexOf("," + i + ",") == -1)res.push(i);    
    }
    
    return res;
};