面试被问到一个问题:查询数组中重复次数最多的前三个数据,让手写代码,当时脑子就一下子有点懵,最怕手写代码了,
大体思路是有,但是感觉不明朗,回去就重新码了一下
我当时的思路是这样的:
1. 对数组进行sort排序,
2. 把数组遍历放到一个对象里,数组的值就是对象的key值,如果key值已经存在,对应val值 +1
3. 创建一个数组num,保存对象中的val值,即:数组中重复数据的重复次数
4. 对num进行排序,以便获取重复次数最大的三个值
5. 最后去for in 对象,获取属性值大于num[num.length - 3]的属性
回来按照我的思路实现了一遍,的确能实现需求,但是感觉代码比较繁琐,遍历也多,
var arr = [1,2,3,4,5,7,8,9,1,1,2,3,3,4,4,5,5,6,6,2,3,4,5,6,4,3,2,2,3,4,5]
function dealArr1(arr){
arr = arr.sort((a,b) => {return a-b})
let returnData = {}
let result = {}
let num = []
let numIndex = -1
arr.map((item,index) => {
if(typeof result[item] == 'undefined'){
numIndex++
result[item] = 1
num[numIndex] = 1
} else {
result[item] = 1 + result[item]
num[numIndex] = 1 + num[numIndex]
}
})
num = num.sort((a,b) => {return a-b})
for(let i in result){
if(result[i] >= num[num.length - 3]){
returnData[i] = result[i]
}
}
return returnData
}
这样的代码自己都忍不了,看着都难受
优化一下?
大体思路差不多,就是把原来数据单独放到每一个对象里,然后再push进数组,对数组进行排序,取前三个值就ok了
function dealArr(arr){
arr = arr.sort((a,b) => {return a-b})
let returnData = []
let result = {}
arr.map((item,index) => {
if(typeof result[item] == 'undefined'){
returnData.push(result)
result = {}
result[item] = 1
result.num = 1
} else {
result[item] = 1 + result[item]
result.num = 1 + result.num
}
})
returnData.sort((a,b) => {return (a.num - b.num)})
return returnData.slice(returnData.length - 3)
}
暂时就先到这里吧,如果有更好的思路和方法可以留言学习下哦