查找一个数组中出现次数最多的值(长度为1000)

今天有一道面试题就是这个问题,然后我自己的解决方法是这样的:

   var findMost = function(arr){
       let arrL=[],arrN=[],count=1;
       //定义两个数组 一个存出现次数 一个存出现的数  顺带定义一个初始出现次数1
       for(const i of arr.keys()){
           for(var j = i+1;j<arr.length;j++){
               if(arr[i]==arr[j]){
                   count++;//如果和后面的值相同 就将出现次数+1
                   arr.splice(arr[j],1);//删掉后面这个值相同的
                   j=j-1;//将j往前移一位  不然会出现少循环的问题
               }
           }
           if(j==arr.length){
               //判断j如果j==arr.length说明就是第二个循环完成了 这个时候就可以存储这个循环的值了
               arrL.push(count);
               arrN.push(arr[i]);
               count = 1;//初始出现次数count
           }
       }
       console.log(arrL,arrN);//打印各个数出现的次数
       //接下来判断arrL数组中最大的值了
       maxL = arrL[0];
       for(const i of arrL.keys()){
           if(maxL<arrL[i]){
               maxL = arrL[i];
           }
       }
       console.log(maxL);
       const index = arrL.indexOf(maxL);
       const Most = arrN[index];
       console.log("出现次数最多的值是:"+Most+";出现次数为:"+maxL);

   }
   findMost([1,2,3,4,5,2,2,34,4,5,322,3,4,54,34]);

然后面试官说我没考虑时间复杂度(其实我是不懂时间复杂度这个东西),然后他提示我和哈希表啥的思路,但是我还是不会,然后刚刚看了一下博客,发现了一个貌似感觉应该更简单的方法,不知道是不是面试官说的那种(其实我是真的菜鸟)

//hash啊 说个思路,定义一个对象obj,遍历数组, 对象的键为数组的元素,值为出现的次数。然后遍历这个对象,找出值为最大的那个。
function findMost(arr) {
    if (!arr.length) return
    if (arr.length === 1) return 1
    var res = {}
    // 遍历数组
    for (var i=0,l=arr.length;i<l;i++) {
        if (!res[arr[i]]) {
            res[arr[i]] = 1
        } else {
            res[arr[i]]++
        }
    }
    // 遍历 res
    var keys = Object.keys(res)
    var maxNum = 0, maxEle
    for (var i=0,l = keys.length;i<l;i++) {
        if (res[keys[i]] > maxNum) {
            maxNum = res[keys[i]]
            maxEle = keys[i]
        }
    }
    return maxNum
}

后面延伸问了一个判断两个对象是否相同,嗯,我不会,我当时只是跟他讲了一下思路,我好好理理。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值