Как я могу найти число, которое встречается чаще всего с помощью JavaScript?
Если пользователь вводит 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");
5 ответов
Создать массив 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 */
Цикл через массив a
используя for(;;)
-циклировать и увеличивать счетчик. Счетчик хранится в hashmap на объекте o
, (o[a[i]] || 0)
необходим для первого появления ключа: если он не найден, значение 0
используется вместо undefined
, См. Также Оценка короткого замыкания: логическое ИЛИ.
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
DEMO
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");
Нет необходимости делать два прохода, следующее накапливает максимум, поскольку это считается:
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');
редактировать
Хорошее решение, но ОП, скорее всего, нужно некоторое объяснение и более подходящие имена переменных. Наиболее часто встречающееся значение в наборе - это режим.
// 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.');
Если существует более одного режима, выигрывает тот, который найден отсчет раз первым с конца массива.
Сортируйте массив, тогда те же самые значения находятся рядом друг с другом, так что вы можете просто зациклить их и искать самую длинную полосу:
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++;
}
}
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 если есть больше, чем max - так что вы должны повторить.
Просто чтобы сгладить один из других ответов, после того, как вы сформировали свой объект значений, вы можете поместить значения в массив и использовать Math.max
чтобы получить верхний предел. обычно Math.max
занимает ряд чисел, но если вы используете .apply
он также может принять array
, То же самое похоже на 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