2017-07-21 8 views
8

配列内で最小の値を見つけなければならず、その数が複数回出現するとそれを数えることができます。私はフォーマットがダウンしていると思うが、それは数字よりももう一つカウントを与える(3ではなく4)。誰も私にいくつかのヒントを与えることができますか助けをよろしく!配列内の同じ値の数値を数える

function small(array) { 
 
    var smallest = array[0]; 
 
    var count = 0; 
 
    for(var i = 0; i < array.length; i++) { 
 
    if(array[i] < smallest) { 
 
     smallest = array[i]; 
 
    } 
 
    if(smallest===array[i]) { 
 
     count++; 
 
    } 
 
    } 
 
    return count; 
 
} 
 

 
small([5,6,2,2,2]);

答えて

4

あなたはその後、リセット、最小の新しい取得するたびに必要です。

なぜカウントを0にリセットする必要はありませんか?

条件が最小に確認されているため=== ARR [i]は、あなたが今

function small(array){ 
 
    var smallest = array[0]; 
 
    var count = 0; 
 
    for(var i = 0; i < array.length; i++) { 
 
     if(array[i] < smallest) { 
 
      smallest = array[i]; 
 
      count = 0; 
 
     } 
 
     if(smallest===array[i]) { 
 
      count++; 
 
     } 
 
    } 
 
    return count; 
 
} 
 
console.log(small([5,6,2,2,2]));

+0

@Kaps感謝を残しているどのように多くのインデックスを参照することですたくさん! 0にリセットする。その背後にある論理は何ですか?新しい最小値を取得するときはいつでも、それは0 – grasshopper

+0

@grashhopperに設定されていたので、リセットが必要です。それはなぜ0ではないのですか?あなたが今最小の=== arr [i]でチェックしている状態を持っているので、あなたが今保存した要素と同じものをチェックしていることを意味します。 – Kaps

+0

@ YuvalBen-Arieはリセットで1を実行します。 – Kaps

0

あなたはsmallest

function small(array){ 
    var smallest = array[0]; 
    var count = 0; 
    for(var i = 0; i < array.length; i++) { 
     if(array[i] < smallest) { 
      smallest = array[i]; 
      count = 0; 
     } 
     if(smallest===array[i]) { 
      count++; 
     } 
    } 
    return count; 
} 
small([5,6,2,2,2]); 
2

を交換する場合は、ここでは2つのループを使用することができます0にcountを設定し、最初の最小数を取得し、回数をカウントする必要があり、それ発生する。時間の複雑さは依然としてO(n)になります。

function small(array){ 
 
    var smallest = array[0]; 
 
    var count = 0; 
 
    for(var i = 0; i < array.length; i++) { 
 
     if(array[i] < smallest) { 
 
      smallest = array[i]; 
 
     } 
 
    } 
 
    for(var i=0; i<array.length; i++){ 
 
     if(smallest===array[i]) { 
 
      count++; 
 
     } 
 
    } 
 
    return count; 
 
} 
 
console.log(small([5,6,2,2,2]));

0

あなたは

array[0] 
に最小の設定を保存した同じ要素をチェックしていること

if文には

smallest = array[i] 

常にtrueです。それはあなたが最初に

var smallest = array[0]; 

ので、それを宣言する方法ですと あなたは、smallestは、配列の最初の項目である、最小= 0または最小= 1

1

初めてのループの実行を設定する必要がありますループが開始される場所は、array[0]なので、最初の反復で条件が真であることを意味し、カウントが増加します。

これは間違った方法です。
最も簡単には、アレイ内の最小数を見つけるためにMath.minを使用してから、ちょうどそれに基づいて配列をフィルタリングし、

function small(arr) { 
 
    let min = Math.min.apply(null, arr); 
 
    return arr.filter(val => val === min).length; 
 
} 
 

 
console.log(small([5, 6, 2, 2, 2]));

+0

これは配列の各項目のすべての整数の最小値を再計算しませんか? (最初に最小値を格納するのではなく) – pinkfloydx33

+0

いいえ、そうではありませんが、Array.filterの3番目の引数を使用しても問題はないことを絶対に確信できます – adeneo

+0

フィルタコールバックが実行されます元の配列の各項目についてそのコールバックの中で関数(Math.min)を呼び出しています。フィルタコールバックを呼び出すごとにMath.minが呼び出されないため、配列全体の最小値(常に​​同じ結果になります)が再計算されます。または私はここに何かを逃していますか? – pinkfloydx33

関連する問題