我被要求执行一项任务,以计算字符串中每个字母出现的次数。它假设所有字符都是按字母顺序排列的小写英文字母。此外,我应该按升序输出字符串字母,以及每个字母的频率。我使用std::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;
}
答案 0 :(得分:2)
您可以省略std::set
,只需这样写
int main() {
std::string s;
std::cin >> s;
int cnt[26] = {};
for (int i = 0; i < s.length(); i++) {
cnt[s[i] - 'a']++;
}
for (int i = 0; i < 26; ++i)
if (cnt[i] > 0)
std::cout << (char)('a' + i) << " : " << cnt[i] << std::endl;
return 0;
}
而是保存在std::set
中,我们检查cnt
中是否存在字符,并在符号出现时输出。
此选项占用的内存较少。
答案 1 :(得分:2)
您可以使用std :: map,例如:
std::map<char, int> mymap;
for (auto &c: s){
mymap [c]++;
}
答案 2 :(得分:0)
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
bool sortbysec(const pair<int,int> &a,const pair<int,int> &b)
{
return (a.second < b.second);
}
int main(){
int len,cntS[26]={0},nonZero=0;
string s;
vector< pair<char,int> >v;
cin>>s;
len=s.length();
for(int i=0;i<len;i++){
cntS[s[i]-'a']++;
}
for(int i=0;i<26;i++){
if(cntS[i]!=0){
nonZero++;
v.push_back(make_pair(char(i+'a'),cntS[i]));
}
}
// Using sort() function to sort by 2nd element
// of pair
sort(v.begin(), v.end(), sortbysec);
for(int i=0;i<v.size();i++){
cout<<v[i].first<<v[i].second<<" ";
}
return 0;
}
答案 3 :(得分:0)
您可以使用地图存储key -> no occurances
,然后将这些对移动到矢量和排序,代码如下:
std::vector<std::pair<char, int>> getSortedChars(std::string const& input) {
std::map<char, int> m;
std::vector<std::pair<char, int>> vp;
for (char c : input) {
++m[c];
}
for (auto e : m) {
vp.emplace_back(std::move(e));
}
std::sort(vp.begin(), vp.end(), [=](std::pair<char, int>& l, std::pair<char, int>& r) {
return l.second < r.second;});
return vp;
}
返回的矢量将具有排序对,然后您可以打印它们。