重学 JS | 找出数组中出现次数最多元素的 4 种算法

用户头像
梁龙先森
关注
发布于: 2020 年 12 月 29 日
重学JS | 找出数组中出现次数最多元素的4种算法

数组相关文章:

数组去重的 7 种算法

找出数组中出现次数最多元素的 4 种算法

数组遍历的 7 种方法及兼容性处理 (polyfill)

场景:

存在一个数组:[1,1,1,2,5,6,4,7,3],通过算法找出次数最多的元素为1,出现次数为:3。

1. 利用键值对

思路:

定义一个对象,在遍历的时候,将数组元素作为对象的键,出现次数作为值。

获取键值对后进行遍历,获取值最大的那个元素,即为结果。

function most(arrays){
if(!arrays.length) return
if(arrays.length === 1) return 1
let obj = {}
// 遍历数组
for(let i=0,l=arrays.length;i<l;i++){
if(!obj[arrays[i]]){
obj[arrays[i]] = 1
}else{
obj[arrays[i]]++
}
}
// 遍历obj
let keys = Object.keys(obj)
let max = 0, maxEle;
for(let i=0;i<keys.length;i++){
if(obj[keys[i]]>max){
max = obj[keys[i]]
maxEle = keys[i]
}
}
return `出现最多次数的元素是:${maxEle},次数为:${max}`
}
most([1,1,2,3,4,5,1]) // "出现最多次数的元素是:1,次数为:3"

2. 对算法1的优化

思路:与算法1一样,不过将2次的遍历减少为1次,将值的判断放在同一次遍历中。

function most(arrays){
let obj = {},max =0,maxEle;
for(let i=0;i<arrays.length;i++){
let val = arrays[i]
obj[val]===undefined?obj[val] = 1:obj[val]++;
// 当前循环中直接比较出现次数最大值
if(obj[val]>max){
max = obj[val]
maxEle = val
}
}
return `出现最多次数的元素是:${maxEle},次数为:${max}`
}
most([1,1,2,3,4,5,1]) // "出现最多次数的元素是:1,次数为:3"

3. 借助reduce()函数

思路:每次处理中优先计算当前元素出现的次数,在每次执行完后与max进行比较,动态更新maxmaxEle的值。

function most(arrays){
let max = 1,maxEle;
let obj = arrays.reduce(function(preVal,curVal){
preVal[curVal]?preVal[curVal]++:preVal[curVal]=1
if(preVal[curVal]>max){
max++
maxEle = curVal
}
return preVal
},{})
return `出现最多次数的元素是:${maxEle},次数为:${obj[maxEle]}`
}
most([1,1,2,3,4,5,1]) // "出现最多次数的元素是:1,次数为:3"

4. 借助ES6与逗号运算符进行优化

Array.prototype.most = function(){
let obj = this.reduce((p,n)=>(
p[n]++ || (p[n]=1),
(p.max = p.max>=p[n]?p.max:p[n]),
(p.key = p.max>p[n]?p.key:n),p),{})
return `出现最多次数的元素是:${obj.key},次数为:${obj.max}`
}
[1,2,3,1,1].most() // "出现最多次数的元素是:1,次数为:3"

5. 总结

至此我们罗列了4种查找数组中最多元素的算法。



发布于: 2020 年 12 月 29 日阅读数: 14
用户头像

梁龙先森

关注

寒江孤影,江湖故人,相逢何必曾相识。 2018.03.17 加入

1月的计划是:重学JS,点个关注,一起学习。

评论

发布
暂无评论
重学JS | 找出数组中出现次数最多元素的4种算法