/*
https://leetcode.cn/problems/find-all-duplicates-in-an-array/description/
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
*/
/*
 1. 看过一次答案,这里试着搞一下
 1. 能出来答案,但是i的技术比较别扭 
 2. 参考官网题解,用 while 替代 “i++” 的奇怪逻辑
 */
 var findDuplicates = function (nums) {
  function swap(arr, l, r) {
    let tmp = arr[l];
    arr[l] = arr[r];
    arr[r] = tmp;
  }
  for (let i = 0; i < nums.length; i++) {
    // 用 while 替代 “i++” 的奇怪逻辑 ---- 2:改进点
    while (nums[i] !== nums[nums[i] - 1]) {
      // 放置 nums[i] 到 索引为 “nums[i] - 1” 的位置
      swap(nums, i, nums[i] - 1);
    } 
  }
  // console.log("sorted arr: ", JSON.stringify(nums));
  // 上面的 for loop结束后,所有的 "nums[i] !== nums[nums[i] - 1]" 都是 true
  let result = [];
  for (let i = 0; i < nums.length; i++) {
    // 判断哪些 “值”和“索引”比匹配,则返回结果
    if (i !== nums[i] - 1) {
      result.push(nums[i]);
    }
  }
  return result;
};
console.log(findDuplicates([4, 3, 2, 7, 8, 2, 3, 1])); // [2,3]
console.log(findDuplicates([1, 1, 2])); // [1]
console.log(findDuplicates([1])); // []