1042 字符统计
题目描述
请编写程序,找出一段给定文字中出现最频繁的那个英文字母。
输入格式:
输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。
输出格式:
在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。
样例
输入
This is a simple TEST. There ARE numbers and other symbols 1&2&3…
输出
e 7
分析
一种简单的方法是使用下标法,先全部变为小写字母,然后存入对应位置,记录出现的次数,找到最大值,具体参考链接: 柳神代码,但是我为了熟练掌握STL的相关使用,因此采用string、map、vector。
具体思路
先用getline存字符串(cin遇到空格无法继续存入空格之后的字符串),使用transform(开始位置,结束位置,存放的开始位置,转为大写/小写)将存入的字符串全转为小写,再使用erase加remove函数删除空格,随后将字母存入map中,key为字母,value为出现的次数,为了使用sort函数排序,将map存入vector中,使用sort自定义cmp函数进行排序,输出第一个值即为答案。
代码
#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<char,int> a,pair<char,int> b){
if(a.second!=b.second) return a.second>b.second;
else return a.first<b.first;
}
int main(){
string s;
getline(cin,s);
map<char,int>ma;
//大写转小写
transform(s.begin(),s.end(),s.begin(),::tolower);
//删除空格
s.erase(remove(s.begin(),s.end(),' '),s.end());
for(int i=0;i<s.size();i++){
if('a'<=s[i]&&s[i]<='z')
ma[s[i]]++;
}
//将 map放入vector中 为了使用sort函数排序
vector<pair<char,int> > vec(ma.begin(),ma.end());
vector<pair<char,int> >::iterator it;
sort(vec.begin(),vec.end(),cmp);
it = vec.begin();
cout<<it->first<<" "<<it->second<<endl;
}