PAT 乙级 1042 字符统计(20) C++版

时间:2022-12-20 12:23:36

1042. 字符统计(20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

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

输入格式:

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

输出格式:

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

输入样例:
This is a simple TEST.  There ARE numbers and other symbols 1&2&3...........
输出样例:
e 7


思路:申请一个容器,只将字母以大写形式存入容器,然后进行排序,再计算效率比一次次遍历容器较高

 1 // 1042.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<iostream>
 6 #include<string>
 7 #include<vector>
 8 #include <algorithm> 
 9 #include<cctype>
10 
11 using namespace std;
12 
13 int main()
14 {
15     int max = 0,sum=0;
16     string str;
17     char c,d;
18     vector<char> v;
19 
20     getline(cin, str);
21     
22     //只将字母存入数组中,且将大写转换为小写
23     for (int i = 0; str[i] != '\0'; i++)
24         if (isalpha(str[i]))//仅为字母才进入容器中
25             v.push_back(tolower(str[i]));//将大写转换为小写
26 
27     sort(v.begin(),v.end());//将所有字母进行排序
28 
29     vector<char>::iterator i, end = v.end();
30 
31     for (i = v.begin(), d = c = *i; i != end; d=*i,i++)
32     {
33         //当前元素与前一个元素不同时为真
34         if (d != (*i))
35         {
36             if (sum > max)
37             {
38                 c = d;
39                 max = sum;
40             }
41 
42             sum = 0;
43         }
44 
45         sum++;
46     }
47     
48     //如果所有的字母只有一种
49     if (d == *(v.begin()))
50         cout << *(v.begin()) << " " << sum;
51     else
52         cout << c << " " << max;
53 
54     return 0;
55 }