C++中计算字符串每个字母出现频率的最优方法是什么?
统计小写字母出现次数并升序输出的实现与优化
嘿,你的这段代码思路很清晰,确实能完成统计字符串中小写字母出现次数并按升序输出的任务!先给你梳理下原代码的逻辑,再分享个更简洁高效的优化方案。
原代码分析
你的代码核心逻辑没问题:
- 用
int cnt[26] = {}初始化一个长度为26的数组,对应26个小写字母,通过s[i] - 'a'将字母映射到0-25的索引位置,遍历字符串完成次数统计。 - 借助
std::set自动排序的特性,插入字符串中的所有字符后,遍历set就能得到升序的字母列表,再对应输出次数。
原代码完整展示:
#include <iostream> #include <set> #include <string> int main() { std::string s; std::cin >> s; int cnt[26] = {}; for (int i = 0; i < s.length(); i++) { cnt[s[i] - 'a']++; } std::set <char> st; for (int i = 0; i < s.length(); i++) { st.insert(s[i]); } for (auto x : st) { std::cout << x << " : " << cnt[x - 'a'] << std::endl; } return 0; }
优化方案
其实咱们完全可以不用std::set,因为已知所有字符都是小写英文字母,直接从'a'到'z'遍历一遍索引,只要对应次数大于0就输出,天然就是升序排列,还能省去插入set的额外开销,代码也更简洁:
#include <iostream> #include <string> int main() { std::string s; std::cin >> s; int cnt[26] = {}; // 用范围for循环遍历字符串,更简洁 for (char c : s) { cnt[c - 'a']++; } // 直接遍历26个小写字母的索引,天然升序 for (int i = 0; i < 26; ++i) { if (cnt[i] > 0) { std::cout << char('a' + i) << " : " << cnt[i] << std::endl; } } return 0; }
这个优化后的代码做了两点改进:
- 使用范围for循环遍历字符串,比传统的索引循环更易读。
- 直接遍历0-25的索引,通过
char('a' + i)转换回对应的字母,跳过次数为0的字母,既保证了升序,又避免了额外容器的使用,效率更高。
内容的提问来源于stack exchange,提问作者Anthony Watson
相关产品推荐
相关产品推荐

