我正在尝试解决数组问题中最受欢迎的项目。
我发现一些使用映射的O(n)解决方案,但是当您混合使用数据类型时,没什么能起作用的
[1,2,1,3,"1","a"]
“ 1”与1混合使用。是否有可能在JS中覆盖比较?或任何可能解决此问题的O(n)解决方案?
这是我使用的最流行的数组元素,要考虑到您可以拥有多个相同数量的数组元素:
function getMostFrequent(array) {
if (array.length == 0)
return null;
let mapEl = {};
let maxEl = [];
let maxCount = 1;
for (let i = 0; i < array.length; i++) {
let el = array[i];
if (mapEl[el] == null) {
mapEl[el] = 1;
} else {
mapEl[el]++;
}
if (mapEl[el] > maxCount) {
maxCount = mapEl[el];
maxEl = [el];
} else if (mapEl[el] === maxCount) {
maxEl.push(el);
}
}
console.log(maxEl);
return maxEl;
}
答案 0 :(得分:2)
一些使用地图的O(n)解决方案
Map
可以正常工作,因为地图“键”可以是任何类型,包括数字,字符串和对象( 是有区别的):
const input = [1,2,1,3,"1", "1", "1", "a"];
const map = new Map();
input.forEach(key => map.set(key, (map.get(key) || 0) + 1));
console.log(
[...map.entries()].reduce((a, b) => b[1] > a[1] ? b : a)
);
还可以使用reduce
,这种情况更适合这种情况:
const input = [1,2,1,3,"1", "1", "1", "a"];
const map = input.reduce(
(map, key) => map.set(key, (map.get(key) || 0) + 1),
new Map()
);
console.log(
[...map.entries()].reduce((a, b) => b[1] > a[1] ? b : a)
);
是的,这些是O(N)
。