您的位置:首页 > 其它

【华为机试】字符统计

2017-07-30 21:15 232 查看
题目描述

如果统计的个数相同,则按照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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: