查询数组中重复次数最多的数据

面试被问到一个问题:查询数组中重复次数最多的前三个数据,让手写代码,当时脑子就一下子有点懵,最怕手写代码了,

大体思路是有,但是感觉不明朗,回去就重新码了一下

我当时的思路是这样的:

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)

    }

暂时就先到这里吧,如果有更好的思路和方法可以留言学习下哦

你可能感兴趣的:(查询数组中重复次数最多的数据)