题目
给定一个只有小写英文字母组成的字符串,串长为n。请你编写程序求出这个字符串中出现次数最多的字母。
输入
输入有两行:第一行是一个正整数n( 1 < n < 100)表示字符串的长度
后面一行是一个长度为n的字符串(只由小写字母组成)
测试用例保证出现次数最多的字母只有一个。
输出
输出一行,仅输出出现次数最多的字母。
样例输入
5
acmcs
样例输出
c
代码
#include <stdio.h>
#include <string.h>
int main()
{
int n;
scanf("%d",&n);
char a[105] = {0};
scanf("%s",&a);
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j] > a[j+1] && j+1<n)
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
char b[30] = {0};
for(i=0;i<26;i++)
{
b[i] = 'a' + i;
}
int c[30] = {0};
int ret = 0;
for(i=0;i<26;i++)
{
for(j=0;j<n;j++)
{
if(a[j] == b[i])
{
ret++;
c[i] = ret;
}
else
{
ret = 0;
}
}
}
int p;
int l = c[0];
for(i=0;i<26;i++)
{
if(l < c[i])
{
l = c[i];
p = i;
}
}
printf("%c\n",b[p]);
return 0;
}
思路(个人见解)
因为字符全由字母构成,此题我便想到用数组来解决,先将录入的字符排序,在通过逐个比对的方式得到出现次数最多的字母
代码解释
第一段:
int n;
scanf("%d",&n);
char a[105] = {0};
scanf("%s",&a);
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j] > a[j+1] && j+1<n)
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
由于全为字母,故此处我们可以将录入的字符按从小到大的顺序排序。
第二段:
char b[30] = {0};
for(i=0;i<26;i++)
{
b[i] = 'a' + i;
}
int c[30] = {0};
int ret = 0;
for(i=0;i<26;i++)
{
for(j=0;j<n;j++)
{
if(a[j] == b[i])
{
ret++;
c[i] = ret;
}
else
{
ret = 0;
}
}
数组b中存放的为a~z的字母,c数组用于存放每一个字母出现的次数,通过上述这种比对方式既找到了每个字母出现的次数,并且还可以得到每个字符在数组中的位置(因为是通过将b数组中的字母与a数组中的比对,即顺序按a ~ z)
第三段:
int p;
int l = c[0];
for(i=0;i<26;i++)
{
if(l < c[i])
{
l = c[i];
p = i;
}
}
printf("%c\n",b[p]);
return 0;
此时只需要找到最大的数字所对应的下标,即为所找字母。