1042 字符统计(20)(20 分)
请编写程序,找出一段给定文字中出现最频繁的那个英文字母。
输入格式:
输入在一行中给出一个长度不超过1000的字符串。字符串由ASCII码表中任意可见字符及空格组成,至少包含1个英文字母,以回车结束(回车不算在内)。
输出格式:
在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。
输入样例:
This is a simple TEST. There ARE numbers and other symbols 1&2&3...........
输出样例:
e 7
解题思路:定一个结构体数组,结构体的内容是一个字符和该字符的长度,先把所有的大写字母都换算成小写字母,计算其字符个数的方法是判断该字符是否重复,如果该字符第一次出现就让其长度为1,否则其长度+1,最后进行结构体排序。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1100;
int a[N];
typedef struct stu
{
char ch;
int lenth;
}STU1;
STU1 stu[N];
bool cmp(STU1 a,STU1 b) //结构体排序
{
if(a.lenth!=b.lenth) //长度由大到小
{
return a.lenth>b.lenth;
}
else if(a.ch!=b.ch) //字典序由小到大
{
return a.ch<b.ch;
}
}
int main()
{
char ch;
int i,n=128;
while(ch=getchar(), ch!='\n')
{
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) //只对大小写字母进行操作
{
if(ch>='A'&&ch<='Z') //把所有的大写字母转换成小写字母
{
ch=ch+32;
}
if(a[ch]==0)
{
a[ch]=1; //如果字符第一次出现,其长度等于1
stu[ch].ch=ch;
stu[ch].lenth=1;
}
else //非第一次出现,长度+1
{
stu[ch].lenth++;
}
}
}
sort(stu,stu+n,cmp); //结构体排序
cout<<stu[0].ch<<" "<<stu[0].lenth;
return 0;
}