我目前正面临着这个问题,我试图在数组中查找最频繁或经常使用的元素。
例如:
const arr = [1,2,1,1,1,2,2,2,1] (Most occuring is: 1)
跟进:如果我想获得第二发生的元素怎么办?
这是我的解决方法:
function returnMostOccurring(arr) {
const obj = {};
arr.forEach(item => {
if(!obj[item]) obj[item] = 1;
else obj[item]++;
})
const res = Object.entries(obj).sort((a,b) => b[1]-a[1]);
return res.shift();
}
我认为这不是解决此问题(O(nLogN)时间复杂度)的最佳方法
处理这种用例的最佳方法是什么?
答案 0 :(得分:3)
您可以进行一个单循环,其中包含一个具有实际最大计数的元素变量和一个用于保留元素计数的对象。
function mostOccurringElement(array) {
var max = array[0],
counter = {},
i = array.length,
element;
while (i--) {
element = array[i];
if (!counter[element]) counter[element] = 0;
counter[element]++;
if (counter[max] < counter[element]) max = element;
}
return max;
}
const array = [1, 2, 1, 1, 1, 2, 2, 2, 1];
console.log(mostOccurringElement(array));