查詢前 n 項級數中重複的元素 JavaScript


假設我們得到一個包含前 n 個自然數的數字陣列,但是其中一個元素出現了兩次,因此元素總數為 n+1。我們的任務是編寫一個函式,該函式接收陣列並以線性時間返回出現兩次的數字。

方法 1:使用 Array.prototype.reduce()

這是一種稍微複雜一點的方法,但在編寫的程式碼方面是最簡潔的。首先,讓我們看看它的程式碼:

const arr = [1,4,8,5,6,7,9,2,3,7];
const duplicate = a => a.reduce((acc, val, ind) => val+acc-
(ind+1))+a.length-1;
console.log(duplicate(arr));

在這裡,我們使用了 reduce 函式,它的回撥函式對陣列的每個元素操作一次,在我們的例子中,它接受三個引數:

  • acc → 累加器,上一次傳遞返回的值;以及
  • val → 當前元素的值;
  • ind → 當前元素的索引

現在,讓我們將我們的程式碼應用於此陣列:

[ 2, 3, 1, 2]

由於此陣列的長度為 4,回撥函式應該總共執行 4 次,但是由於我們沒有為 reduce() 函式提供 initialValue 引數,迭代將從索引 1 開始,累加器將最初賦值為第零個索引的值,因此總共將執行 3 次。

第一次迴圈

acc = 2, val = 3, ind = 1
return value = 2+3 - (1+1) = 3

第二次迴圈

acc = 3, val = 1, ind = 2
return value = 3+1 - (2+1) = 1

第三次迴圈

acc = 1, val = 2, ind = 3
return value = 1+2 - (3+1) = -1

陣列結束

因此,陣列返回 -1,然後

-1 + (4-1) = -1 + 3 = 2

從 duplicate() 函式返回,這實際上是正確的結果。

方法 2:Array.prototype.forEach()

在這種方法中,我們遍歷陣列,獲取它的和,然後從中減去前 (n-1) 個自然數的和(其中 n 是陣列的長度),剩下的就是重複出現的數字,所以我們返回它。

示例

const arr = [1,4,8,5,6,7,9,2,3,7];
const duplicate = a => {
   let sum = 0;
   const { length: n } = a;
   a.forEach(num => sum += num);
   return sum - ((n*(n-1))/2);
}
console.log(duplicate(arr));

輸出

控制檯中的輸出將是:

7

更新於:2020-08-19

81 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告