JSは配列内の繰り返し番号を見つけます

JSは配列内の繰り返し番号を見つけます

長さ n の配列 nums 内のすべての数値は、0 から n-1 の範囲にあります。配列内の一部の数値が繰り返されていますが、繰り返される数値の数がわかりません。また、各数値が何回繰り返されるかもわかりません。配列内で繰り返される数値を見つけてください。

  • 例 1:

入力: [2、3、1、0、2、5、3]
出力: 2 または 3
制限: 2 <= n <= 100000

  • 問題解決のアイデア:

1. 一般的な考え方は、入力配列をソートし、ソートされた配列から繰り返しの数値を見つけることです。ソートされた配列を最初から最後までスキャンするだけです。長さ n の配列のソートには O(nlogn) の時間計算量が必要です

2. 2 番目のアイデアは、ハッシュ テーブルを使用してそれを解決することです。配列内の数値を最初から最後までスキャンします。数値をスキャンするたびに、O(1) 時間をかけて、その数値がハッシュ テーブルに含まれているかどうかを判断します。数値が既にハッシュ テーブルに存在する場合は、重複する数値を見つけます。 . 番号がハッシュ テーブルに存在しない場合は、ハッシュ テーブルに追加します。このアイデアの時間計算量は O(n)、空間計算量は O(n) です。

3. ここで、配列のインデックスを使用します。配列内の数値を最初から最後までスキャンします。添え字 i の付いた数値がスキャンされると、最初に数値 (m で示される) が i と等しいかどうかを比較します。したがって、次の番号のスキャンを続けます。そうでない場合は、それを m 番目の番号と比較し、それが m 番目の番号と等しい場合は、重複した番号が見つかったことになります (番号は下付き文字 i と m の両方に表示されます)。 ; m 番目の数値と等しくない場合は、i 番目の数値と m 番目の数値を交換し、m をその値が属する場所に置きます。次に、重複する番号が見つかるまで、この比較と交換のプロセスを繰り返します。

方法 1: 配列の並べ替えを使用する

/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    
    
    var m=[];
    if (nums == null || nums.length < 0) {
    
    
        return -1;
    }
    // 题目的条件是数组 nums 里的所有数字都在 0~n-1 的范围内
    for (let i = 0, length = nums.length; i < length; i++) {
    
    
        if (nums[i] < 0 || nums[i] > length - 1) {
    
    
        return -1;
        }
    }
   // 排序
    nums=nums.sort();
    for(var i=0;i<nums.length-1;i++){
    
        
        if(nums[i]==nums[i+1]) {
    
    
            return nums[i];
        }           
    }
} 
findRepeatNumber([2,3,1,0,2,5,3]);

方法 2: ハッシュ テーブルを使用する

/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    
    
    if (nums == null || nums.length < 0) {
    
    
      return -1;
    }
    // 题目的条件是数组 nums 里的所有数字都在 0~n-1 的范围内
    for (let i = 0, length = nums.length; i < length; i++) {
    
    
      if (nums[i] < 0 || nums[i] > length - 1) {
    
    
        return -1;
      }
    }
    // 哈希表
    let map = new Map();
    for(let i of nums){
    
    
        if(map.has(i)) return i;
        map.set(i, 1);
    }
    return null;
};
findRepeatNumber([2,3,1,0,2,5,3]);

方法 3: インプレース交換

/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    
    
  if (nums == null || nums.length < 0) {
    
    
    return -1;
  }
  // 题目的条件是数组 nums 里的所有数字都在 0~n-1 的范围内
  for (let i = 0, length = nums.length; i < length; i++) {
    
    
    if (nums[i] < 0 || nums[i] > length - 1) {
    
    
      return -1;
    }
  }
  // 思路就是把数字放到对应的索引上  比方说数字3放到索引3的位置
  for (let i = 0; i < nums.length; i++) {
    
    
    // 如果当前数字跟对应的索引不相同则交换
    while (nums[i] != i) {
    
    
      if (nums[i] == nums[nums[i]]) {
    
    
        return nums[i];
      }
      let temp = nums[i];
      nums[i] = nums[temp];
      nums[temp] = temp;
    }
  }
  return -1;
};
findRepeatNumber([2,3,1,0,2,5,3]);

同じテキストの短い書籍番号へようこそ: JS は配列内の繰り返し番号を見つけます

おすすめ

転載: blog.csdn.net/qq_38970408/article/details/122175908