Skip to content

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 的执行效果有多强

优质题解