451. 根据字符出现频率排序
解题过程
INFO
题目链接 给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。 返回 已排序的字符串 。如果有多个答案,返回其中任何一个
javascript
/**
* @link https://leetcode.cn/problems/sort-characters-by-frequency/
* @title 451. 根据字符出现频率排序
* @description 给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。
* 返回 已排序的字符串 。如果有多个答案,返回其中任何一个
* @param {string} s
* @return {string}
*/
// 解法一
// 思路:跟242解法差不多,通过将字符串相同字符分组,然后最后返回根据分组数量排序在转成字符串返回
// 缺点:执行结果一般
var frequencySort = function (s) {
const res = new Map()
for (let i = 0; i < s.length; i++) {
if (res.has(s[i])) {
res.get(s[i]).push(s[i])
} else {
res.set(s[i], [s[i]])
}
}
return [...res.values()].sort((a, b) => b.length - a.length).flat().join('')
}
// 解法二
// 思路:针对解法一通过对象优化
// 缺点:比解法一执行结果稍差
var frequencySort = function (s) {
const res = {}
for (let i = 0; i < s.length; i++) {
if (res[s[i]]) {
res[s[i]].push(s[i])
} else {
res[s[i]] = [s[i]]
}
}
return [...Object.values(res)].sort((a, b) => b.length - a.length).flat().join('')
}
// 解法三
// 思路:优化解法一代码
var frequencySort = function (s) {
const res = new Map()
for (const key of s) {
res.set(key , (res.get(key) || 0) + 1)
}
// return Array.from(res).sort((a, b) => b[1] - a[1]).map(item => item[0].padStart(item[1], item[0])).join('')
// 优化👆🏻代码
return Array.from(res).sort((a, b) => b[1] - a[1]).reduce((per, cur) => per + `${cur[0].repeat(cur[1])}`, '')
}
// const result = frequencySort('tree') // eert
// const result = frequencySort('cccaaa') // cccaaa
const result = frequencySort('Aabb') // bbAa
console.log(result)
解题感受
跟昨天做的 242 解法差不多,都是运用哈希表记录字符出现的次数,然后进行排序合并。第三种解法通过优化了下代码,执行结果比前两种方法的好太多了,可见原生 API 的执行效果有多强