当前位置:首页 > 力扣 > 力扣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;
    }
};



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣35:二分法在搜索插入位置中的运用

力扣35:二分法在搜索插入位置中的运用

有序数组的定位在一个严格递增的数字序列中,每个元素都有其确定的位置。当新元素试图加入时,我们需要回答两个问题:它是否已经存在?如果不存在,它应该插入在哪里?这道题要求我们在O(log n)时间内完成这...

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

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

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

力扣145:递归之美 轻松掌握二叉树后序遍历

力扣145:递归之美 轻松掌握二叉树后序遍历

题目解读二叉树的后序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。这种遍历方式特别适合需要先处理子节点再处理父节点的场景,如内存释放...

洛谷P1007士兵过桥问题详解 C++贪心算法实现与优化

洛谷P1007士兵过桥问题详解 C++贪心算法实现与优化

题目解读这道题目描述了一座长度为L的桥上有n个士兵,每个士兵每秒可以向左或向右移动1个单位。当士兵到达桥的端点(0或L+1)时离开桥。要求计算所有士兵离开桥的最小时和最大时间。解题思路最小时计算:每个...

「CSP-J 2024真题详解」洛谷P11227扑克牌问题:基于桶排序思想的高效解法 附完整C++代码

「CSP-J 2024真题详解」洛谷P11227扑克牌问题:基于桶排序思想的高效解法 附完整C++代码

一、题目解读本题要求计算标准扑克牌堆中缺失的牌数:输入规范:接收n张牌(1≤n≤52),每张牌以"数字+字母"格式表示核心算法:需要检测并统计缺失的扑克牌种类特殊规则:当n=1时固...

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

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

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

发表评论

访客

看不清,换一张

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