一个算法题

1-100范围中,有1000个可重复的数,以出现次数的多少排序,返回一个新数组?

  • 蹦出来的第一个直观的解法,用一个对象将遍历的数组的出现次数记录下来,然后把记录的值排序,反查key,然后合并成一个数组。值排序处卡壳了一下。反思了下,得到一个有点笨但理解容易的解法。
/**
 * 根据对象的一个属性排序 
 * @param data 原始数组(数组单个元素为对象)
 * @param sortKey 要根据排序的key
 * @param type desc 倒序, asc 正序
 */
function sortObjArrByKey(data, sortKey, type) {
    let arr = [...data];
    if (type === 'asc') {
        arr.sort((a, b) => a[sortKey] - b[sortKey]);
    } else if (type === 'desc') {
        arr.sort((a, b) => b[sortKey] - a[sortKey]);
    }
    return arr;
}

/**
 * 以数字出现的次数排序
 * @param  原始数组
 */
function sortArrByCount(arr) {
    var countObj = {};
    var originCountArr = [];
    arr.forEach(item => {
        countObj[item] = countObj[item] ? countObj[item] + 1 : 1;
    });
    console.log('countObj', countObj);
    originCountArr = Object.keys(countObj).map(key => {
        return {
            key: key,
            value: countObj[key],
        };
    });
    var sortedCountArr = sortObjArrByKey(
        originCountArr,
        'value',
        'desc'
    );
    let sortedCountNumArr = sortedCountArr.map(item => +item.key);
    console.log('result:', sortedCountNumArr);
    return sortedCountNumArr;
}

// 用少量数量模拟一下
var arr = [1, 4, 2, 1, 5, 7, 8, 10, 25, 11, 10, 7, 100, 7, 20];
let resultArr = sortArrByCount(arr);

输出结果:
在这里插入图片描述

应该还有其他更精妙的解法,想到了补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值