作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include <iostream>
#include <string>
using namespace std;
int main () {
int cnt[26] {};
char alpha[26];
string s = "abcdefffggghiii";
for (int i = 0; i < s.length(); i++) {
cnt[s[i] - 'a']++;
}
for (int i = 'a'; i <= 'z'; i++) {
alpha[i - 'a'] = i;
}
for (int i = 0; i < 26; i++) {
if (cnt[i]) {
cout << alpha[i] << " " << cnt[i] << endl;
}
}
return 0;
}
我想按降序打印字符串中每个字母的频率。我想对 cnt 数组进行排序并从 25
打印到 0
但它只会打印带有错误字母的频率。我怎样才能修复它以降序打印例如 i 3
等等?
最佳答案
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// Create result container
auto x = vector<pair<char, int>>();
std::string s = "abcdefffggghiii";
for (auto& l : s) {
// Find the item that corresponds to letter
auto pLetter =
find_if(x.begin(), x.end(), [&l](pair<char, int> &arg) {
return arg.first == l;
});
if (pLetter != x.end())
pLetter->second++; // If item corresponding to letter is found, increment count
else {
x.push_back(make_pair(l, 1)); // Otherwise, create a new result entry
}
}
// Sort results by count in descending order
std::sort(x.begin(), x.end(),
[](auto &left, auto &right) { return left.second > right.second; });
for (auto i = x.begin(); i != x.end(); ++i)
std::cout << i->first << ':' << i->second << '\n';
}
生产
f:3
g:3
i:3
a:1
b:1
c:1
d:1
e:1
h:1
你可以运行它here .这将 C++14 lambda 用于 find_if 和排序谓词。此解决方案与@Retired Ninja 的解决方案非常相似,不同之处在于结果 vector 仅包含那些具有非零计数的字母的项目。这意味着它可以扩展到 wstrings 而无需大的结果 vector 。
关于c++ - c++ - 如何按降序打印字符串中每个字母的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51006754/
我是一名优秀的程序员,十分优秀!