当前位置: 代码迷 >> 综合 >> PTA乙级 1042 字符统计 (20 分)
  详细解决方案

PTA乙级 1042 字符统计 (20 分)

热度:74   发布时间:2023-12-01 11:10:14.0

 题目:

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

e 7

解题思路:

最后的输出要求是小写字母,在遍历输入的字符串时是否为英文字母时,逐一将其中的大写字母转换为小写字母,并对其转换为int进行出现次数的统计。因为小写字母只有26个,那么定义一个ans[30]的数组就足够存放数据了。接着遍历ans数组,找出出现次数最多的字母。

!!!题目说明如果存在出现次数并列的情况,则输出字母次序最小的,所以在寻找出现次数最频繁的字母时,只要比 > max即可,不需要 ≥ max,因为当前后有字母出现次数一样多时, ≥的写法会把出现次数最大的字母替换为字母次序靠后的那个字母,跟题意要的结果不一样啦。

!!!输入字符串时不能用cin输入,cin遇到空格就停下啦。

(cin遇到坑说我不跳啦,因为我懒hhh)

AC代码:

#include<bits/stdc++.h>
using namespace std;
int ans[30];
int main(){string s;getline(cin,s);//用cin输入字符串的话,遇到空格就不输入啦int len=s.length();for(int i=0;i<len;i++){if(s[i]<='Z'&&s[i]>='A'||s[i]<='z'&&s[i]>='a'){s[i]=tolower(s[i]);//将字母转换为小写字母ans[s[i]-'a']++;//统计出现次数}}int max=0;char maxi='a';for(int i=0;i<=26;i++){if(ans[i]>max){max=ans[i];maxi=i+'a';}}cout<<maxi<<" "<<max;return 0;
}