簡體   English   中英

如何使用for循環返回數組中重復項的首次出現?

[英]How to return the first occurrence of repeated item in an array using for loop?

我正在嘗試使用數組和數據結構構建當前的邏輯。 我正在嘗試使用for循環來實現邏輯

function getRepeatingNumber(arr) {

  for (var i = 0; i < arr.length; i++) {
    for (var j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        return arr[i];
      }
    }
  }
  return undefined;
}
getRepeatingNumber([2, 3, 6, 5, 2]);

上面的函數接受數組並返回數組中的重復項,因此在上面的情況下它將返回2。但是如果我有一個像這樣的數組arr [2,3,3,6,5,2],該怎么辦?在這種情況下,它應該返回3,但由於外部循環的索引[0]為2,因此返回2作為答案。

如何實現返回第一次出現重復項的功能。

相反,與迭代的j 的部分i ,重復之前的部分i

 function getRepeatingNumber(arr){ for (var i = 1; i < arr.length; i++) { for (var j = 0; j < i; j++) { if (arr[i] === arr[j]) { return arr[i]; } } } } console.log(getRepeatingNumber([2,3,3,6,5,2])); 

請注意,不需要顯式的return undefined ,這已經是默認行為。

您也可以使用indexOf來縮短代碼:

 function getRepeatingNumber(arr){ for (var i = 1; i < arr.length; i++) { if (arr.indexOf(arr[i]) < i) { return arr[i]; } } } console.log(getRepeatingNumber([2,3,3,6,5,2])); 

您甚至可以決定使用find -如果不匹配(在我們的情況下沒有重復),它將返回undefined

 function getRepeatingNumber(arr){ return arr.find((a, i) => { if (arr.indexOf(a) < i) { return true; } }); } console.log(getRepeatingNumber([2,3,3,6,5,2])); 

如果對大型數組執行此操作,那么具有線性時間復雜度的解決方案就變得很重要。 在這種情況下, Set將很有用:

 function getRepeatingNumber(arr){ var set = new Set; return arr.find(a => { if (set.has(a)) return true; set.add(a); }); } console.log(getRepeatingNumber([2,3,3,6,5,2])); 

而且,如果您喜歡函數的功能和一線,那么:

 const getRepeatingNumber = r=>(t=>r.find(a=>[t.has(a),t.add(a)][0]))(new Set); console.log(getRepeatingNumber([2,3,3,6,5,2])); 

您需要一個數據結構來跟蹤第一個出現的索引。

我的建議是使用數組存儲所有重復數字的索引。 以升序對數組進行排序,並從數組的第一個索引處返回該項目。

 function getRepeatingNumber(arr){ var resultIndexArr = []; var count = 0; var flag = 0; for(var i=0;i<arr.length;i++) { for(var j=i+1;j<arr.length;j++) { if(arr[i] === arr[j]) { flag = 1; resultIndexArr[count++] = j; } } } resultIndexArr.sort((a, b) => a - b); var resultIndex = resultIndexArr[0]; if(flag === 1) return arr[resultIndex]; else return; } console.log(getRepeatingNumber([2,3,6,5,2])); // test case 1 console.log(getRepeatingNumber([2,3,3,6,5,2])); // test case 2 console.log(getRepeatingNumber([2,5,3,6,5,2])); // test case 3 

這將返回正確的結果,但這不是最佳解決方案。 最好的解決方案是將項目存儲在數組中,檢查每次迭代是否已在數組中存在該項目,如果存在則返回該項目。

作為一個javascript開發人員,您應該熟悉函數式編程和高階函數,因此請檢查文檔以進一步了解一些有用的函數:例如filter - find - reduce - findIndex map ...

文檔

現在回答您的問題:

首先,您應該逐步思考:

  • 獲取數組中某項的出現作為函數:

 const arr = [2, 5, 6, 2, 4, 5, 6, 8, 2, 5, 2] const res = arr.reduce((numberofOcc, item) => { if (item === 2) numberofOcc++ return numberofOcc }, 0); console.log(`result without function ${res}`); /* so my function will be */ const occurenceFun = (num, arr) => { return arr.reduce((numberofOcc, item) => { if (item === num) numberofOcc++ return numberofOcc }, 0); } console.log(`result using my function ${occurenceFun(2, arr)}`); 

  • 現在我有了這個函數,所以我可以在另一個函數中使用它來獲得我在數組中出現的更高次數

 const arr = [1, 2, 5, 6, 8, 7, 2, 2, 2, 10, 10, 2] const occurenceFun = (num, arr) => { return arr.reduce((numberofOcc, item) => { if (item === num) numberofOcc++ return numberofOcc }, 0); } /*let's create our function*/ const maxOccurenceFun = arr => { let max = 0; arr.forEach(el => { if (max < occurenceFun(el, arr)) { max = el } }) return max; } console.log(`the max occurence in this array is : ${maxOccurenceFun(arr)}`); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM