【题目描述】
给定一个由a-z这26个字符组成的字符串,统计其中哪个字符出现的次数最多。
【输入】
输入包含一行,一个字符串,长度不超过1000。
【输出】
输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格分开。如果有多个字符出现的次数相同且最多,那么输出ascii码最小的那一个字符。
【输入样例】
abbccc
【输出样例】
c 3
解题思路
此题比较简单,是排序算法的入门题。a-z总共有26个字母,所以我们可以声明一个a[26]的数组,a[0]存储a出现的次数,a[1]存储b出现的次数,依次类推,a[25]存储z出现的次数。然后遍历字符串,将对应位的值+1。这里有个小技巧,可以通过一个index值记录出现最多次数字母的索引值,在遍历过程中,对其进行赋值,详细见代码中的注释。
参考答案
#include "iostream"
using namespace std;
int main(){
//创建数组,存储每个字母出现的次数(a存在索引为0的位置,b存储在1的位置,以此类推,z存储在25的位置)
int a[26] = {};
string c;
cin>>c;
int len = c.length();
//出现最多次数字母所在的数组索引位置
int index = 0;
for(int i=0;i<len;i++){
//字母出现次数+1
a[c[i]-'a']++;
//如果当前字母出现次数>已知的最多次数index位置的字母出现次数,则将index赋值为当前字母在a中的索引值
//或者如果当前字母出现次数=已知的最多次数index位置的字母出现次数,且当前字母在a中的索引值小于index的值,同样需要将index赋值为当前字母在a中的索引值(即取ascii码最小的那一个字符)
if(a[c[i]-'a'] > a[index] || (a[c[i]-'a']==a[index] && c[i]-'a'<index)){
index = c[i] - 'a';
}
}
//输出出现最多的字符和出现的次数
printf("%c %d",'a'+index,a[index]);
return 0;
}