2017-02-16 52 views
0

有人可以解釋一下這個解決方案是如何工作的,這個練習可以讓你找到數組中最頻繁的元素,返回它被計數的次數?我是JS新手,只需要一點幫助就能理解邏輯!Javascript的兩個循環的說明

function mostFrequentItemCount(array) { 
     var freq = 0; 
     var mostFreq = 0; 

     for (var i = 0; i <= array.length; i++) { 
      for (var j = i; j < array.length; j++) { 
       if (array[i] === array[j]) { 
        freq++; 
       } 
       if (freq >= mostFreq) { 
        mostFreq = freq; 
       } 
       if (array.length === 0) { 
        return 0; 
       } 
      } 

      freq = 0; 
     } 

     return mostFreq; 
    } 

    mostFrequentItemCount([4, 3, 4, 4, 5, 5, 5, 5, 4, 3]) 
+0

第一個'for'循環中的條件是錯誤的 – Andreas

+0

您的意思除了像'i <= array.length'和redunadant代碼這樣的明顯錯誤還是與這些錯誤? – Jamiec

+0

另外,爲什麼'4'最頻繁? ''5''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' – Jamiec

回答

1

除了對評論提到的錯誤,它需要在第一循環中的數組的每個元素,並將其與放置之後的其它元件的邏輯(第二循環開始於第一回路電流指數),並統計出現次數。

IMO必須有一個更優化的方式來做到這一點,因爲元素在它是不相關的情況下計算多次(沒有用再次省略第一算上4,當我們滿足了第二個)

它也不會與同頻元素應付..

1

,如果你是一個真正的JS解決方案很感興趣:

var hashMap = {}; // in js any object can be also used as a map 
 
    var array = [4, 3, 4, 4, 5, 5, 5, 5, 4, 3]; 
 
    
 
    for (var i = 0; i < array.length; i++) // there are better ways of doing this with js es6 
 
    { 
 
     if (!hashMap[array[i]]) hashMap[array[i]] = 0; // if this is the first time of this value in the map - initialize it with zero 
 
    
 
     hashMap[array[i]]++; // increase the count of each value 
 
    } 
 
    
 
    for (var value in hashMap) 
 
    { 
 
     console.log(value + ' ' + hashMap[value]); // print each value with the correct amount of instances 
 
    }

+1

雖然這不是問題本身的答案,但在這裏很好。但是一個很好的補充。 – Connum

0

嵌套循環應避免性能的角度來看,我敢肯定有一個更好的解決辦法,但我仍想給你所提供的代碼段是如何工作的理解:

function mostFrequentItemCount(array) { 
    // initialize variables 
    var freq = 0; // variable that will hold frequency count of the currently checked element 
    var mostFreq = 0; // variable that will hold the highest frequency count 

    // iterate over all elements of the array 
    for (var i = 0; i <= array.length; i++) { 
     // from the current index i, iterate over the array again, 
     // so all "following" elements will be checked 
     for (var j = i; j < array.length; j++) { 
      if (array[i] === array[j]) { 
       // if one of the following elements equals 
       // the current element of the first for loop, 
       // increase frequency count 
       freq++; 
      } 
      // if the frequency of this element is higher then the 
      // currently highest frequency, set the mostFreq variable 
      // to the frequency of the current element 
      if (freq >= mostFreq) { 
       mostFreq = freq; 
      } 
      // if the array has no elements, return 0 
      if (array.length === 0) { 
       return 0; 
      } 
     } 

     // reset freq to 0 so we can start fresh with the next element 
     freq = 0; 
    } 
    // return the most frequent: 
    return mostFreq; 
} 

也請請注意,這僅適用於僅包含數字的數組(並且將返回頻率,而不是最常見的數字,如註釋中所述)。當要比較字符串或對象時,必須進行適配以返回實際元素。

0

而另一種解決方案:

function mostFrequentItemCount(array) { 
    return array.reduce(function(p,c){ 
     if(p[c] === undefined) 
      p[c] = 0; 
     p[c]++; 
     if(p.mostFrequent == undefined || p[c]>p[p.mostFrequent]) 
      p.mostFrequent = c; 
     return p; 
    },{}).mostFrequent; 
} 
0

此功能沒有找到最常見的元素,只有時代的最常見的元素出現了量。

它通過計算每個元素出現的次數來工作。

outer for循環確保您檢查數組中的每個元素。內部循環計算這個元素出現的次數。每當內部循環發現比前一個元素更頻繁的元素時,它會更新mostFreq

值得注意的是,這個代碼可以通過使用一個輔助數組進行優化,該數組計算每個元素出現的次數。另外,如註釋中所述,循環條件不正確,因爲array.length返回數組中的第一個空位置。