題目描述
如果統計的個數相同,則按照ASII碼由小到大排序輸出 。如果有其他字符,則對這些字符不用進行統計。
實現以下接口:
輸入一個字符串,對字符中的各個英文字符,數字,空格進行統計(可反覆調用)
按照統計個數由多到少輸出統計結果,如果統計的個數相同,則按照ASII碼由小到大排序輸出
清空目前的統計結果,重新統計
調用者會保證:
輸入的字符串以‘\0’結尾。
輸入描述:
輸入一串字符。
輸出描述:
對字符中的
各個英文字符(大小寫分開統計),數字,空格進行統計,並按照統計個數由多到少輸出,如果統計的個數相同,則按照ASII碼由小到大排序輸出 。如果有其他字符,則對這些字符不用進行統計。
示例1
輸入
aadddccddc
輸出
dca
分析:先用一個大小爲63的容器記錄出現的字符的個數,在定義一個結構體分別定義字符本身和字符個數,把出現的字符個數和字符本身保存到結構體容器中,在對結構體容器按要求排序。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct charnum{
int num;
char its;
};
bool comnum(charnum a,charnum b){
if(a.num==b.num) return a.its<b.its; //按ASCII排序;
return a.num>b.num; //按個數排序;
}
inline void countchar(string s){
if(s.empty()) return;
int i=0;
vector<int> count(63,0);
while(i<s.size()){ //記錄每個字符的個數;
if(s[i]>='a'&&s[i]<='z') count[s[i]-'a']++;
else if(s[i]>='A'&&s[i]<='Z') count[s[i]-'A'+26]++;
else if(s[i]>='0'&&s[i]<='9') count[s[i]-'0'+52]++;
else if(s[i]==' ') count[62]++;
++i;
}
vector<charnum> tt; //把字符和個數保存在結構體容器;
for(int i=0;i<count.size();++i){
if(count[i]==0) continue;
charnum t;
if(i<26) {t.num=count[i];t.its=i+'a';}
else if(i<52) {t.num=count[i];t.its=i-26+'A';}
else if(i<62) {t.num=count[i];t.its=i-52+'0';}
else {t.num=count[i];t.its=' ';}
tt.push_back(t);
}
sort(tt.begin(),tt.end(),comnum); //按要求排序;
for(int i=0;i<tt.size();++i){
cout<<tt[i].its;
}
cout<<endl;
}
int main(){
string s;
while(getline(cin,s))
countchar(s);
return 0;
}
改進方法:用一個大小128的容器記錄出現的字符個數,太菜了竟然不知道有pair<>的存在,用了個結構體,現在用pair<>替代結構體的部分,總體代碼簡潔了不少。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool comnum(pair<char,int> a,pair<char,int> b){
if(a.second==b.second) return a.first<b.first;
return a.second>b.second;
}
inline void countchar(string s){
if(s.empty()) return;
vector<int> count(128,0);
for(int i=0;i<s.size();++i)
if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]>='0'&&s[i]<='9'||s[i]==' ')
count[s[i]]++;
vector<pair<char,int>> tt;
for(int i=0;i<128;++i){
if(count[i]!=0)
tt.push_back(make_pair(i,count[i]));
}
sort(tt.begin(),tt.end(),comnum);
for(int i=0;i<tt.size();++i){
cout<<tt[i].first;
}
cout<<endl;
}
int main(){
string s;
while(getline(cin,s))
countchar(s);
return 0;
}