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

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

10个月前 (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;
    }
};



原创内容 转载请注明出处

分享给朋友:

相关文章

70.爬楼梯|三步破解动态规划核心奥秘

70.爬楼梯|三步破解动态规划核心奥秘

题意新解:站在楼梯底仰望n级台阶,每步可选1或2阶,最终的路径组合犹如斐波那契数列般展开。比如到达第3阶的路径可由第1阶跨两步,或第2阶跨一步构成,这种递推规律揭示了两两相邻状态间的紧密关联。思路解析...

力扣746:三步通关最小花费爬楼梯

力扣746:三步通关最小花费爬楼梯

题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值cost[i],之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点...

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

题目重解想象你是一名药师,有t分钟在山上采集m种草药。每种草药需要time分钟采集,价值为num。这就像考试时分配时间做题,要选择收益最大的题目组合。题目要求计算在规定时间内能获得的最大草药价值。解题...

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

力扣1700题:无法吃午餐的学生数量 - 队列模拟解法详解

力扣1700题:无法吃午餐的学生数量 - 队列模拟解法详解

内容简介本文详细解析了力扣1700题"无法吃午餐的学生数量"的队列模拟解法。通过模拟学生排队取餐的过程,统计无法吃到喜欢三明治的学生数量。文章包含完整注释代码、算法思路讲解和复杂度...

牛客4493题解析:桶排序优化求解最大间隔问题(附代码详解)

牛客4493题解析:桶排序优化求解最大间隔问题(附代码详解)

一、题目解读牛客4493题要求在一个整数数组中寻找最大间隔,即数组中任意两个元素之间的最大差值。题目强调需要高效算法,尤其在处理大规模数据时仍需保持性能。理解题目核心在于如何快速定位元素间的最远距离,...

发表评论

访客

看不清,换一张

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