3

ユーザーが 5 つの数字を入力した場合、たとえば... 4, 4, 7, 7, 4. 4 は 3 回 (最多) 発生しました。したがって、出力は になります4

JavaScript を使用してこれを行うにはどうすればよいですか? あなたの助けをいただければ幸いです。ありがとう!

私はこれまでにこれを試しました。機能しますが、長すぎて、短くて簡単な方法を探しています。

PS これは私の宿題ではありません!

    var n = parseInt(prompt("How many numbers do you like to enter?", ""));
    var num = new Array();

    for (i = 1; i <= n; i++) {
        num[i] = parseInt(prompt("Enter a number", ""));
        document.write("Entered numbers are: " + num[i] + "<br/>");
    }

    var total = new Array();
    for (i = 1; i <= n; i++) {
        var count = 1;
        for (j = i + 1; j <= n; j++) {
            if (num[i] == num[j]) {
                count++;
            }
            total[i] = count;
        }
    }

    var most = 0;
    for (i = 0; i < n; i++) {
        if (most < total[i]) {
            most = total[i];
        }
        var val = i;
    }
    document.write("<br/>" + num[val] + " is occurred " + most + " times");
4

5 に答える 5

4

配列リテラルを使用して、多数の数値を含む配列 を作成します。a

var a = [1, 2, 3, 4, 4, 5, 1, 2, 3, 1, 2, 1, 1];

オブジェクト リテラルoを使用してプレーン オブジェクトを作成します。

var o = {},          /* Creates a new object */
    i = 0,           /* Declare variable i, initialise value at 0*/
    m = {m:0,t:null},
    t,               /* Declare variable t */
    len = a.length;  /* Declare variable len, set value to the array's length */

-loopaを使用して配列をループし、カウンターをインクリメントします。カウンターは object のハッシュマップに格納されます。はキーの最初の出現に必要です。見つからない場合は、の代わりに値が使用されます。短絡評価: 論理 ORも参照してください。for(;;)o
(o[a[i]] || 0)0undefined

for ( ; i < len ; i++ ) {
    o[ a[i] ] = ( o[ a[i] ] || 0 ) + 1;
}

o次に、次のようなオブジェクトがあります。

o = {
    "1": 5,
    "2": 3,
    "3": 2,
    "4": 2,
    "5": 1
}

次に、ループをo使用してfor(.. in ..)ループし、提示された最大時間を見つけます。
ループの最後で、条件付き三項.. ? .. : ..演算子が使用されます。

for ( i in o ) {
    t = { 
        m: o[i], 
        i: i 
    };
    m = m.m < t.m ? t : m;
}

このループの後mは次のようになります。

m = { 
    i: "1", 
    m: "5"
};

最大値は、次を使用して取得できます。

o[m];

魔女はあなたに与えます:

5

デモ

http://jsbin.com/utiqey/

var a = [1, 2, 3, 4, 4, 5, 1, 2, 3, 1, 2, 1, 1]; 

var o = {}, 
    i = 0, 
    m = {m:0,t:null}, 
    t,
    len = a.length; 

for ( ; i < len ; i++ ) { 
    o[ a[i] ] = ( o[ a[i] ] || 0 ) + 1; 
} 


for ( i in o ) { 
    t = { 
        m: o[i], 
        i: i 
    };
    m = m.m < t.m ? t : m;
} 

alert(m.i + " is the highest presented " + m.m + " times"); 
于 2012-04-08T09:21:37.430 に答える
3

2 つのパスを作成する必要はありません。次のようにカウントすると、最大値が累積されます。

var g = [4, 4, 7, 7, 4, 5, 6, 7, 8, 6, 5, 2, 2, 2, 3, 4, 5]; //your array

for (var t = {}, maxn = g[0], max = 0, gi, i = g.length; i--;) {
  if (max < (t[gi = g[i]] = (t[gi] || 0) + 1)) {
    max = t[gi];
    maxn = gi;
  }
}

document.write ('The number ' + maxn + ' occurs ' + max + 'times');

編集

良い解決策ですが、OPには説明とより適切な変数名が必要になる可能性があります。セット内で最も一般的に使用される値はモードです

// Use any member of g to seed the mode
var mode = g[0];
// The number of times the current mode has occurred
var count = 0;
// Results object
var t = {};
var i = g.length;
var gi;

// Loop over all the members
while (i--) {

  // Get the value at i
  gi = g[i];

  // Keep track of how many times the value has been found  
  // If the number hasn't occured before, add it with count 1
  // Otherwise, add 1 to its count
  t[gi] = (t[gi] || 0) + 1;

  // Set the mode to the current value if it has occurred 
  // more often than the current mode
  if (count < t[gi]) {
    count = t[gi];
    mode = gi;
  }
}

alert('The mode is ' + mode + ' and occurs ' + count + ' times.');

複数のモードがある場合、配列の最後から最初にcount回見つかったモードが勝ちます。

于 2012-04-08T09:54:50.493 に答える
2

http://jsbin.com/ageyol/3/edit

var g = [4, 4, 7, 7, 4, 5, 6, 7, 8, 6, 5, 2, 2, 2, 3, 4, 5]; //your array
var t = {}; // object which contain the numbers as properties.

for (var i = 0; i < g.length; i++)
{
    if (!t[g[i]]) t[g[i]] = 0; //if the property doesnt exists , so create one with counter 0.
    t[g[i]]++; // also - increase the property VALUE.
}

var max = 0;

for (i in t)
{
    if (t[i] > max) max = t[i]; //check if property value is larger then the current MAX val.
    document.write(i + "  " + t[i] + "<br/>");
}
document.write(t[max]);

最大値を超える場合はps-したがって、繰り返す必要があります。

于 2012-04-08T08:57:43.677 に答える
2

配列を並べ替えると、同じ値が隣り合っているので、それらをループして最長のストリークを探すことができます。

arr.sort();

var maxValue, maxCount = 0, cnt = 1, last = arr[0];
for (var i = 1; i <= arr.length; i++) {
  if (i = arr.length || arr[i] != last) {
    if (cnt > maxCount) {
      maxCount = cnt;
      maxValue = last;
    }
    cnt = 1;
    if (i < arr.length) last = arr[i];
  } else {
    cnt++;
  }
}
于 2012-04-08T11:08:08.247 に答える
0

他の答えの1つをリフするために、値のオブジェクトを形成したら、値を配列にプッシュしMath.maxて上限を取得するために使用できます。通常Math.maxは一連の数字を取りますが、使用する.applyarray. についても同様ですMath.min

var o = { 1: 5, 2: 3, 3: 2, 4: 2, 5: 1 };

var out = [];
for (var k in o) {
  out.push(o[k]);
}

var upperbound = Math.max.apply(null, out); // 5
于 2013-12-07T15:15:12.480 に答える