2016-04-29 10 views
1

は、数字の配列を与えた関数を作成しなければならなかった練習問題の答えとして、ほとんどの出現数で数値を返し、複数の数値に最大値発生回数はマイナーなものを返します。これは私が行った実装ですが、私は髪の毛を引っ張って、この例で9の代わりに10を返す理由を考え出しています。配列内の数値の最大出現を取得する方法

trueを1< 9と評価しているようです。どうしましたか?あなたの第二のループにtypeof(x)を置く

function maxOccurencies(arr) { 
 
    var aux = [], max = 0, final = null; 
 
    
 
    for (var i=0,t=arr.length; i<t; i++) { 
 
     aux[arr[i]] = (aux[arr[i]] || 0) + 1; 
 
     if (aux[arr[i]] > max) max = aux[arr[i]]; 
 
    } 
 
    
 
    for (x in aux) { 
 
     if (aux[x] == max && (x < final || final == null)) { 
 
      final = x; 
 
     } 
 
    }  
 
    
 
    return final; 
 
} 
 

 
document.write(maxOccurencies([10,10,10,9,9,9,8,7,4,5,1]));

答えて

1

あなたの変数のいくつかは、タイプstringとしてキャストされていることを明らかに!それがどこで起こっているのか正確に見ています。私はのために配列のJavascriptの者の正確なハンドリングを知らなかった、

非常に興味深い:あなたは9

編集の正しい値を返すために

if (aux[x] == max && (parseInt(x) < parseInt(final) || final == null)) { 

if (aux[x] == max && (x < final || final == null)) { 

を置き換えることができます... inループ。詳細については、以下の他の質問を参照してください:

JavaScript For-each/For-in loop changing element types

Why is using “for…in” with array iteration such a bad idea?

はまた、あなたがarr.forEach(function(element){...});を使用できることに注意して要素がそのまま自分のタイプで返されます。

+1

はい、 'for x in y'は、実際には数値ではなくキーである' x'の値を与えます。 'y [x]'に対しては使用できますが、他の計算では型を変換せずに使用することはできません。 – m69

0

私はauxのxが数字ではないので、if文が正しく評価されていないという問題があると思います。数字に変換すると、9(下)が返されます。

(3 == 3 & &は( "10" < "9" || "9" == nullの))真

私が引っ張ってる

function maxOccurencies(arr) { 
 
    var aux = [], max = 0, final = null; 
 
    
 
    for (var i=0,t=arr.length; i<t; i++) { 
 
     aux[arr[i]] = (aux[arr[i]] || 0) + 1; 
 
     if (aux[arr[i]] > max) max = aux[arr[i]]; 
 
    } 
 
    for (x in aux) { 
 
     if (aux[x] == max && (parseInt(x) < final || final == null)) { 
 
      final = parseInt(x); 
 
     } 
 
    }  
 
    
 
    return final; 
 
} 
 

 
document.write(maxOccurencies([10,10,10,9,9,9,8,7,4,5,1]));

0

」と評価され私の髪は、この例では9の代わりに10を返す理由を理解しています。

比較のこの種では、10が1 より、9,8,7,6,5,4,3より小さい2が、ビットおろし金であるためだ:)

この小さなタイプ補正しますそれを修正してください:

function maxOccurencies(arr) { 
    aux = [], max = 0, final = null; 

    for (var i=0,t=arr.length; i<t; i++) { 
     aux[arr[i]] = (aux[arr[i]] || 0) + 1; 
     if (aux[arr[i]] > max) max = aux[arr[i]]; 
    } 

    for (x in aux) { 
     if (aux[x] == max && (+x < final || final == null)) { 
      final = x; 
     } 
    }  

    return final; 
} 
関連する問題