当前位置:首页 > 力扣 > 力扣451:ASCII数组计数法 用128个桶解决频率排序问题

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

2个月前 (05-15)

力扣451:ASCII数组计数法 用128个桶解决频率排序问题 桶排序 贪心算法 C++ 力扣 字符串 第1张

题目重解

给定一个字符串,将字符按照出现频率降序排列。例如输入"tree",可能返回"eetr"或"eert"。题目要求我们不考虑字母顺序,只需保证相同字符相邻且高频字符在前。


解题思路

1.使用128大小的数组统计每个ASCII字符出现次数

2.每次遍历桶数组找出当前最大频率的字符

3.将该字符按出现次数追加到结果字符串

4.将该字符的计数清零避免重复处理

5.循环直到结果字符串长度等于原字符串

通过多次线性扫描实现了O(n)时间复杂度(严格来说是O(128n)),空间复杂度为O(128)。


代码详解

class Solution {
public:
    int bocket[128] = {0}; // ASCII码桶计数器
    
    string frequencySort(string s) {
        // 统计字符频率
        for (int i = 0; i < s.size(); i++) {
            bocket[s[i]]++; // 每个字符对应的ASCII码位置计数+1
        }
        
        string s1 = ""; // 结果字符串
        while (s1.size() < s.size()) {
            int maxidx = 0; // 当前最大频率字符的ASCII码
            
            // 找出当前频率最高的字符
            for (int i = 1; i < 128; i++) {
                if (bocket[i] > bocket[maxidx]) {
                    maxidx = i;
                }
            }
            
            // 将字符按频率追加到结果
            for (int i = 0; i < bocket[maxidx]; i++) {
                s1 += maxidx;
            }
            
            bocket[maxidx] = 0; // 已处理字符清零
        }
        return s1;
    }
};



原创内容 转载请注明出处

分享给朋友:

相关文章

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

力扣965题深度解析:单值二叉树的判断技巧

力扣965题深度解析:单值二叉树的判断技巧

重新解读题目 判断一棵二叉树是否为“单值二叉树”,即所有节点的值是否完全相同。题目看似简单,实则考验对树结构递归特性的理解。若一棵树的所有节点值相同,其必然满足:根节点与左右子树的值一致,且...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。