Найти наиболее частый элемент массива JS с циклом while? - PullRequest
0 голосов
/ 04 ноября 2019

Я создал функцию, которая находит наиболее частый элемент массива JS с двумя циклами for, отображает элемент и сколько раз в массиве. Как я могу сделать это с помощью цикла while?

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

//ta = times appeared / m = max / arrchar = array character
var ta = 1;
var m = 0;
var arrchar;

for (var i = 0; i < arr.length; i++) {
  for (var j = i; j < arr.length; j++) {
    if (arr[i] == arr[j])
      m++;
    if (ta < m) {
      ta = m;
      arrchar = arr[i];
    }
  }
  m = 0;
}
console.log(arrchar + "(" + ta + ")");

Ответы [ 4 ]

1 голос
/ 04 ноября 2019

Целью цикла while является использование условий выхода. Поскольку условия выхода нет, я, по сути, создал довольно эффективный алгоритм цикла for и просто заменил цикл for на цикл while.

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

var occurences = {};

var max = 0;
var champion;

var index = 0;

while (index < arr.length) {
  var item = arr[index];
  occurences[item] = (occurences[item] || 0) + 1;
  if (occurences[item] > max) {
    max = occurences[item];
    champion = item;
  }
  index += 1;
}

console.log(`${champion} has ${max} occurences`);

К сожалению, в приведенном выше коде всегда будут учитываться 3 и "3" как одно и то же значение. Если вы не хотите, чтобы это произошло, вам следует вместо этого использовать карту.

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

var occurences = new Map();

var max = 0;
var champion;

var index = 0;

while (index < arr.length) {
  var item = arr[index];
  var newSize = (occurences.get(item) || 0) + 1;
  occurences.set(item, newSize);
  if (newSize > max) {
    max = newSize;
    champion = item;
  }
  index += 1;
}

console.log(`${champion} has ${max} occurences`);
0 голосов
/ 04 ноября 2019

Запустите следующий код. Это даст вам результат, которого вы ожидаете больше всего.

const arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a',2, 4, 9, 3];

// result array
var result = [];

$.each(arr, function( index, value ) {
    if(result[value] === undefined) 
        result[value] = 1;
    else
        result[value] = result[value] + 1;
});

console.log(result);
0 голосов
/ 04 ноября 2019

Вы можете использовать метод фильтра с циклом while. Создайте отфильтрованный массив для каждого индекса arr. Если длина фильтруемого массива больше, чем maxOccurence, установите для длины фильтруемого массива значение maxOccurence. Вы можете попробовать другой метод прототипа массива. Там может быть более простой способ.

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

var char = "";
var maxOccurence = 0;
var i = 0;

while(i < arr.length){
  var filteredArr = arr.filter(x=> x === arr[i]);
  if(filteredArr.length > maxOccurence){
    char = arr[i];
    maxOccurence = filteredArr.length;
  }
  i++;
}
console.log(char + "(" + maxOccurence + ")");
0 голосов
/ 04 ноября 2019

Вы можете использовать редуктор массива:

const arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

let max, winner;

const arrReduce = arr.reduce((acc, curr, index) => {
  acc[curr] = acc[curr] ? acc[curr] += 1 : 1;
  if(max < acc[curr]) winner = curr
  max = max > acc[curr] ? max : acc[curr];
  return acc;
}, {});

console.log(max, winner)
...