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

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

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



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第92题:三步定位 精准反转链表指定区间

力扣第92题:三步定位 精准反转链表指定区间

题目解读给定一个单链表和两个整数left与right,要求将链表中从第left个节点到第right个节点的部分进行反转,而保持其他部分不变。例如,对于链表1→2→3→4→5,left=2,right=...

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

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

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

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

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

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

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

一、题目解读牛客13271题要求从给定的数字字符串中删除K个数字,使得剩余数字按原顺序排列后得到的最小数。题目核心在于如何在保持数字相对顺序的前提下,通过删除操作得到最优解。需注意结果字符串可能包含前...

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

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

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

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

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

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

发表评论

访客

看不清,换一张

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