PAT 1042 字符统计(字符串+散列)

请编写程序,找出一段给定文字中出现最频繁的那个英文字母。

输入格式:

输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。

输出格式:

在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。

输入样例:

This is a simple TEST.  There ARE numbers and other symbols 1&2&3...........

输出样例:

e 7

思路>>

解决是否出现过,出现了多少次(出现次数最多)这类问题,都需要用散列。本题的题意是给定一个字符串,输出26个字母中出现频率最高的字母,虽然字符串中可能有别的符号或者数字,但这些信息是无用的,我们只需要处理字符串中出现的字母。

题目要求输出小写字母,故一开始统计时就将大写字母当成小写字母来统计。

最后再用一个for循环,判断出现频率最高的字母,这里要求有并列时输出字母序小的,故循环从a到z;如果题目要求是输出字母序大的,要从z到a。

代码>>

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     int hashtable[128]={0};
 5     char str[1010];
 6     //scanf("%s",str);
 7     fgets(str,1010,stdin);
 8     int len=strlen(str);
 9     for(int i=0;i<len;i++){
10         if(str[i]>='A'&&str[i]<='Z'){
11             hashtable[(int)str[i]+32]++;
12         }
13         else if(str[i]>='a'&&str[i]<='z'){
14             hashtable[(int)str[i]]++;
15         }
16     }
17     int max=0;
18     for(int i=97;i<123;i++){
19         if(hashtable[i]>hashtable[max]) max=i;
20     }
21     printf("%c %d",max,hashtable[max]);
22 }

字符串的输入>>

这题我一开始考虑用scanf来输入字符串,没有考虑题目给的字符串里有空格的情况,而gets现在已经不用了,故用fgets(数组名, 数组长度, stdin);

posted @ 2020-04-02 20:37  U40大贤者泰塔斯  阅读(176)  评论(0)    收藏  举报