统计一串字符中出现次数最多的字符

【问题描述】
统计字符串里面哪个英文字母字符最多,并统计次数。
【输入形式】
第一行输入字符串。
【输出形式】
输出出现次数最多(相同则一起输出)的字符和次数,并用空格隔开。
【样例输入1】
asddfssaasswef
【样例输出1】
s 5
【样例输入2】
tomtomas
【样例输出2】
t 2
o 2
m 2
要求:要用到字符对应的ASCll码、数组
(希望给个完整的程序,有注释容易看懂,谢谢!)

代码如下:


#include <stdio.h>
int main()
{
    int cnt[26] = {0};
    int zm[26];
    
    char buf[1000]={0};
    int i,j,tmp;
    scanf("%s",buf);
    for(i=0;buf[i]!='\0';i++)
    {
        cnt[buf[i]-'a']++;
    }
    for(i=0;i<26;i++)
        zm[i] = i;
    //排序
    for (i=0;i<25;i++)
    {
        for(j=0;j<25-i;j++)
        {
            if(cnt[j] < cnt[j+1])
            {
                tmp = cnt[j];
                cnt[j] = cnt[j+1];
                cnt[j+1] = tmp;

                tmp = zm[j];
                zm[j] = zm[j+1];
                zm[j+1] = tmp;
            }
        }
    }
    //显示
    printf("%c %d\n",zm[0]+'a',cnt[0]);
    for(i=1;i<26;i++)
    {
        if(cnt[i] == cnt[0])
            printf("%c %d\n",zm[i]+'a',cnt[0]);
        else
            break;
    }
    return 0;
}

可以创建一个长度为26的全零数组=>arr,然后遍历字符串,对每个字符的ascii码减去‘a'的ascii码得到=>index,然后对arr[index]++,最后输出arr中的最大值,并对其索引值加上'a'的ascii码得到原先字符。

代码如下,有帮助望采纳

#include <stdio.h>
#include <string.h>
int main(void)
{
    char s[10000]= {'\0'};
    int i=0,num[26]= {0},max=0;
    gets(s);
    for(i=0; i<strlen(s); i++)
    {
        if(s[i]>='A' && s[i]<='Z') //大写转小写,题目没说大写算不算,我就默认不区分大小写了 
        {
            s[i]+=32;
        }
        num[s[i]-97]++; //利用ASC码作为数组下标,使对应的数组元素值增加 
    }                    //第i个字母对应num[i-1],比如a对应num[0] 
    for(i=0; i<26; i++)
    {
        if(max<num[i]) //找数组num中的最大值 
            max=num[i];
    }
    for(i=0; i<26; i++)
    {
        if(max==num[i]) //输出num中的最大值,如果有同时最大的情况,则都会输出 
        {
            printf("%c %d\n",97+i,max);
        }
    }
    return 0;
}

img

img

你好同学!既要统计字母个数最多显示,也要保证原先字母顺序不乱【就是你的第二个示例】

img

我给出了我的代码,仅供参考,一起学习,mua

#include <stdio.h>
int main(){
    int count[26], range[26], firstappear[26];
    //count用来储存字母出现的个数:count[0]储存a字母个数,count[1]储存b字母个数,依次类推 
    char a[1000]; //假设输入字符串最多包含1000个字符,你可以自己根据要求修改 
    int i,j,temp, nfirstappear=0;
    scanf("%s",&a);//输入字符串 
    for(i=0;i<26;i++)count[i]=0;//初始化count值为0 
    for(i=0;a[i]!='\0';i++){
        //找到字符a[i]对应的是哪个字母,比如a[i]是A字母j=0, 如果是B字母,j=1依次类推 
        if(a[i]<='z' && a[i]>='a')j = a[i]-'a';//找大写字母对应的j值  
        else if(a[i]<='Z' && a[i]>='A')j = a[i]-'A';// 找小写字母对应的j值 (我这里考虑了大写字母你,可以改成只考虑小写字母只需要删除这行就行)
        else continue;
        count[j]++; //把对应的字母上的count值加1 
        // 计算第一次出现 
        if(count[j]==1){
            firstappear[nfirstappear] = j; //计算第一次出现的顺序并记录 
            nfirstappear++; 
        }    
    } 
    //下面对字母出现个数进行排序 
    for(i=0;i<26;i++)range[i]=i; //初始顺序是从126的字母顺序,等下排序好追踪
    for(i=0;i<26;i++)for(j=i+1;j<26;j++)if(count[i]<count[j]){
        temp = count[i]; //调换顺序 
        count[i] = count[j];
        count[j] = temp;
        temp = range[i];
        range[i] = range[j];
        range[j] = temp;
    } 
    //输出结果
    // for(i=0;count[i]==count[0];i++) printf("%c %d\n", range[i]+'a', count[i]); //这个没有考虑字符串顺序输出结果,舍去 
    //现在考虑顺序输出 
    for(i=0;i<nfirstappear;i++){
        for(j=0; j<26; j++){
            if(count[j]==count[0] && firstappear[i]==range[j]) printf("%c %d\n", range[j]+'a', count[j]);//如果满足顺序要求且字母个数第一则先输出 
        }
    }
    return 0;
}

供参考:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    int i,k,max_l,max_u;
    int lett_l[26]={0};//小写字母
    int lett_u[26]={0};//大写字母
    char s[1024];
    cout<<"输入字符串:"<<endl;
    cin.getline(s,1024); //字符串输入
    k = strlen(s);//取得字符串长度
    for (i=0;i<k;i++)
    {
         if(s[i]>='a'&&s[i]<='z')
            lett_l[s[i]-'a']++;   //小写字母计数
         else
         if(s[i]>='A'&&s[i]<='Z')
            lett_u[s[i]-'A']++;   //大写字母计数
    }
    max_l=lett_l[0];max_u=lett_u[0];
    for(i=0;i<26;i++)             //找到次数最大值
    {
        if(lett_l[i] > max_l) max_l=lett_l[i];
        if(lett_u[i] > max_u) max_u=lett_u[i];
    }
    for(i=0;i<26;i++)//输出统计结果
    {
        if(lett_u[i]==max_u && lett_u[i]!=0)
            cout<<(char)('A'+i)<<" "<<lett_u[i]<<endl;
        if(lett_l[i]==max_l && lett_l[i]!=0)
            cout<<(char)('a'+i)<<" "<<lett_l[i]<<endl;
    }
   
    return 0;
}