音乐网站的建设,网站建设php带数据库模板,前端很难学吗,青春网页制作素材题目描述
给定一个字符串#xff0c;请将字符串里的字符按照出现的频率降序排列。示例 1:输入:
tree输出:
eert解释:
e出现两次#xff0c;r和t都只出现一次。
因此e必须出现在r和t之前。此外#xff0c;eetr也是一个有效的答案。
示例…题目描述
给定一个字符串请将字符串里的字符按照出现的频率降序排列。示例 1:输入:
tree输出:
eert解释:
e出现两次r和t都只出现一次。
因此e必须出现在r和t之前。此外eetr也是一个有效的答案。
示例 2:输入:
cccaaa输出:
cccaaa解释:
c和a都出现三次。此外aaaccc也是有效的答案。
注意cacaca是不正确的因为相同的字母必须放在一起。
示例 3:输入:
Aabb输出:
bbAa解释:
此外bbaA也是一个有效的答案但Aabb是不正确的。
注意A和a被认为是两种不同的字符。来源力扣LeetCode
链接https://leetcode-cn.com/problems/sort-characters-by-frequency
著作权归领扣网络所有。商业转载请联系官方授权非商业转载请注明出处。方法1哈希表堆
思路
用哈希表来记录每个字符的出现次数以字符出现次数建立一个大顶堆一边弹出堆顶一边构建新的字符串
复杂度分析
时间复杂度$O(nklogk)$n 是字符串的长度k 是字符串中字符集的大小。空间复杂度$O(k)$k 是字符串中字符集的大小堆的大小。
代码
JavaScript Code
/*** param {string} s* return {string}*/
var frequencySort function (s) {const map {}for (let i 0; i s.length; i) {const c s[i];map[c] (map[c] || 0) 1}// 堆的数据结构 [char, count]const list Object.keys(map).map(c [c, map[c]])const heap new MaxHeap(list, function comparator(inserted, compared) {return inserted[1] compared[1];});let str while (heap.size() 0) {const [char, cnt] heap.pop();str char.repeat(cnt)}return str
};// **************************************************class Heap {constructor(list [], comparator) {this.list list;this.comparator comparator;this.init();}init() {const size this.size();for (let i Math.floor(size / 2) - 1; i 0; i--) {this.heapify(this.list, size, i);}}insert(n) {this.list.push(n);const size this.size();for (let i Math.floor(size / 2) - 1; i 0; i--) {this.heapify(this.list, size, i);}}peek() {return this.list[0];}pop() {const last this.list.pop();if (this.size() 0) return last;const returnItem this.list[0];this.list[0] last;this.heapify(this.list, this.size(), 0);return returnItem;}size() {return this.list.length;}
}class MaxHeap extends Heap {constructor(list, comparator) {super(list, comparator);}heapify(arr, size, i) {let largest i;const left Math.floor(i * 2 1);const right Math.floor(i * 2 2);if (left size this.comparator(arr[largest], arr[left]))largest left;if (right size this.comparator(arr[largest], arr[right]))largest right;if (largest ! i) {[arr[largest], arr[i]] [arr[i], arr[largest]];this.heapify(arr, size, largest);}}
}