[路飞]_LeetCode_451. 根据字符出现频率排序

148 阅读1分钟

题目

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

示例 1:

输入:
"tree"

输出:
"eert"

解释:
'e'出现两次,'r''t'都只出现一次。
因此'e'必须出现在'r''t'之前。此外,"eetr"也是一个有效的答案。

来源:力扣(LeetCode)leetcode-cn.com/problems/so…

解题思路

  1. 通过 Map 统计字符出现次数;
  2. 将字符次数入大顶堆 MaxPriorityQueue;
  3. 将堆中有序的元素反向生成字符串;

代码实现

var frequencySort = function(s) {
    //统计字符出现次数
    const map = new Map()
    for (const c of s) {
        map.set(c, map.has(c) ? map.get(c) + 1 : 1)
    }

    //将字符次数入大顶堆
    const maxQueue = new MaxPriorityQueue()
    for ([key, value] of map) {
        maxQueue.enqueue(key, value)
    }

    //将堆中有序的元素反向生成字符串
    let ans = ''

    while(!maxQueue.isEmpty()) {
        const { element, priority } = maxQueue.dequeue()
        ans += new Array(priority).fill(element).join('')
    }

    return ans
};

如有错误欢迎指出,欢迎一起讨论!