2017-02-16 7 views
0

配列の中で最も頻繁に使用される要素を見つけ出し、カウントされた回数を返します。私はJSには新しく、ロジックの理解に少しだけ助けが必要です!別にコメントに記載されたエラーからJavascriptの2つのループの説明

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'や冗長コードのような明白なエラーを除いて、あるいはそれらのエラーを意味しますか? – Jamiec

+0

また、なぜ「4」が最も頻度が高いのですか? 「4」と同数の「5」があります。 – Jamiec

答えて

1

、それは(第2のループは最初のループ現在のインデックスから始まる)第一のループ内の配列の各要素を取得し、後に配置他の要素と比較することをロジック、その発生をカウントする。

IMO関連性のない状況で要素が何度も数えられるため、より最適化された方法が必要です(2番目の要素を満たしたときに4を数えるのに使用しません)

はまた、同じ度数要素と対応しておりません。..

1

あなたはREAL 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

この関数最も頻繁要素、最も頻度の高い要素が現れ倍の量だけを見つけることができません。

各要素の表示回数をカウントすることで機能します。

外側のforループは、配列内のすべての要素を必ずチェックします。内側のループは、この要素が何回現れたかを数えます。内側のループが以前の要素よりも頻繁に要素を見つけるたびに、mostFreqを更新します。

このコードは、各要素が何回出現したかを数える、馴染みの良い配列を使用して最適化することができます。また、コメントに記載されているように、array.lengthは配列の最初の空の位置を返すため、ループ条件は正しくありません。

関連する問題