算法16(力扣451)——根据字符出现频率排序

1、问题

给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的频率 是它出现在字符串中的次数, 返回 已排序的字符串。如果有多个答案,返回其中任何一个。

2、示例

(1)

输入: s = "tree"

输出: "eert"

解释: 'e'出现两次,'r'和't'都只出现一次。

因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。

(2)

输入: s = "cccaaa"

输出: "cccaaa"

解释: 'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。

注意"cacaca"是不正确的,因为相同的字母必须放在一起。

(3)

输入: s = "Aabb"

输出: "bbAa"

解释: 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。

注意'A'和'a'被认为是两种不同的字符。

3、实现思路

将字符串分割成数组,然后利用map统计频次,通过sort排序,最后将排好序的数组通过join拼接为字符串

4、具体步骤

(1) 将字符串分割成数组

(2)统计频次

(3)将map数组按照键值的形式存到数组

(4)将键通过repeat重复值次,使用join拼接

5、完整代码

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>根据字符出现频率排序</title>
  </head>
  <body>
    <p>
     <p>
         给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的频率 是它出现在字符串中的次数
     </p> 
     <p>
        返回 已排序的字符串。
      如果有多个答案,返回其中任何一个。
     </p>
    </p>
    <p>
        <p>
           输入: s = "tree"
            输出: "eert"
            解释: 'e'出现两次,'r'和't'都只出现一次。
            因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。 
        </p>
        <p>
            输入: s = "cccaaa"
            输出: "cccaaa"
            解释: 'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
            注意"cacaca"是不正确的,因为相同的字母必须放在一起。
        </p>
        <p>
            输入: s = "Aabb"
            输出: "bbAa"
            解释: 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
            注意'A'和'a'被认为是两种不同的字符。
        </p>
    </p>
    <p>
        将字符串分割成数组,然后利用map统计频次,通过sort排序,最后将排好序的数组通过join拼接为字符串
    </p>
    <script>
        // let  s = "tree"
        // let  s = "cccaaa"
        let s = "eeeelolovtcd"
        frequencySort(s)
        function frequencySort(s){
            // 分割
            let arr = s.split("")
            // console.log(arr);
            // 统计频次
            const newMap = new Map()
            arr.forEach(item => {
                if (newMap.has(item)) {
                    newMap.set(item,newMap.get(item)+1)
                }else{
                    newMap.set(item,1)
                }
            });
            //  console.log(newMap);
            // 排序
            const mapArray = Array.from(newMap.entries());
            mapArray.sort((a,b)=>b[1]-a[1])
            // console.log(mapArray);
            const str = mapArray.map(item => item[0].repeat(item[1])).join('');
            //  console.log(str);
            return str
       
        }

    </script>
  </body>
</html>

6、力扣通过代码

javascript 复制代码
/**
 * @param {string} s
 * @return {string}
 */
var frequencySort = function(s) {
            // 分割
            let arr = s.split("")
            // console.log(arr);
            // 统计频次
            const newMap = new Map()
            arr.forEach(item => {
                if (newMap.has(item)) {
                    newMap.set(item,newMap.get(item)+1)
                }else{
                    newMap.set(item,1)
                }
            });
            //  console.log(newMap);
            // 排序
            const mapArray = Array.from(newMap.entries());
            mapArray.sort((a,b)=>b[1]-a[1])
            // console.log(mapArray);
            const str = mapArray.map(item => item[0].repeat(item[1])).join('');
            //  console.log(str);
            return str
  
};
相关推荐
apcipot_rain3 分钟前
【应用密码学】实验五 公钥密码2——ECC
前端·数据库·python
ShallowLin8 分钟前
vue3学习——组合式 API:生命周期钩子
前端·javascript·vue.js
Nejosi_念旧29 分钟前
Vue API 、element-plus自动导入插件
前端·javascript·vue.js
互联网搬砖老肖30 分钟前
Web 架构之攻击应急方案
前端·架构
IT猿手35 分钟前
基于强化学习 Q-learning 算法求解城市场景下无人机三维路径规划研究,提供完整MATLAB代码
神经网络·算法·matlab·人机交互·无人机·强化学习·无人机三维路径规划
pixle01 小时前
Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码
前端·3d·echarts
麻芝汤圆2 小时前
MapReduce 入门实战:WordCount 程序
大数据·前端·javascript·ajax·spark·mapreduce
juruiyuan1113 小时前
FFmpeg3.4 libavcodec协议框架增加新的decode协议
前端
Peter 谭4 小时前
React Hooks 实现原理深度解析:从基础到源码级理解
前端·javascript·react.js·前端框架·ecmascript
万能程序员-传康Kk4 小时前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游