【算法学习记录-散列】【PAT B1042】字符统计

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

e 7


思路:

0、《算法笔记》在散列这块的题目设置,每题都体现了“用ASCII码作为数组下标”的重要思想

 

1、整体思路

scanf配合正则表达式读入含空格的字符串,存入str数组,以下标对应字符的ASCII码

for循环进行统计(记得先转小写)

最后依次比较元素值,找到最大的输出即可

 

2、题解代码

 1 #include <cstdio> 
 2 #include<cstring>
 3 
 4 int main() 
 5 {
 6     int arr[128];
 7     for (int i = 0; i < 128; i++) {
 8         arr[i] = 0;
 9     }
10     
11     char str[1010];
12     scanf("%[^\n]",str);
13     int len = strlen(str);
14     
15     for (int i = 0; i < len; i++) {
16         printf("%c", str[i]);
17     }
18 
19     char c;
20     for (int i = 0; i < len; i++) {
21         if (str[i] >= 'a' && str[i] <= 'z') {
22             c = str[i];
23             arr[c]++;
24         } else if (str[i] >= 'A' && str[i] <= 'Z') {
25             c = str[i];
26             c +=32;
27             arr[c]++;
28         }
29     }
30     
31     int max = 0, k = 0;
32     for (int i = 0; i < 128; i++) {
33         if (arr[i] > max) {
34             max = arr[i];
35             k = i;
36         } else if (arr[i] = max) {
37             if ((char)i < (char)k) {
38                 k = i;
39             }
40         }
41     }
42     
43     printf("%c %d", (char)k, max);
44 }

 

posted @ 2021-01-25 14:28  CheapTrick  阅读(119)  评论(0)    收藏  举报