每日一题——1636.按照频率将数组升序排序

方法一 个人方法

用数组的键值对形式保存每个数字和他出现的次数,将对象的键值对转为数组,对数组进行自定义sort()排序,优先使用出现频次排序,如果出现频次一样就用大小就行排序。

排序完后按照出现频次拼接成字符串再转为数组

var frequencySort = function(nums) {
    let arr= {}
    for(let num of nums){
        if(arr[num]){
            arr[num]++
        }else[
            arr[num]=1
        ]
    }
    let list=Object.entries(arr)
    list.sort((a,b)=>{
        if(a[1]===b[1]){
            return (b[0]-'')-(a[0]-'')
        }
        return a[1]-b[1]
    })
    let str = ''
    for(let item of list){
        str+=(item[0]+',').repeat(item[1])
    }
    str=str.slice(0,str.length-1)
    return str.split(',')
};

消耗时间和内存情况:

方法二 Map集合

用Map集合记录数字和出现的次数,按照元素频率和数值对数组进行排序即可。

var frequencySort = function(nums) {
     const cnt = new Map();
    for (const num of nums) {
        cnt.set(num, (cnt.get(num) || 0) + 1);
    }
    const list = [...nums];

    list.sort((a, b) => {
        const cnt1 = cnt.get(a), cnt2 = cnt.get(b);
        return cnt1 !== cnt2 ? cnt1 - cnt2 : b - a;
    });
    const length = nums.length;
    for (let i = 0; i < length; i++) {
        nums[i] = list[i];
    }
    return nums;
};

消耗时间和内存情况:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值