jqtree 2021-09-10 09:15 采纳率: 80%
浏览 507
已结题

输入n串字符串,统计每串出现最多的字母

【问题描述】小民同学所在的班级有n名同学,这n名同学的姓名都是由小写英文字母组成的,这些同学的姓名中包含空格。现在小民想知道这n名同学的姓名中a-z哪个英文字母出现最多,其出现次数是多少?
【输入形式】
第1行为一个整数n,表示该班学生的人数。
下面为n行字符串(每行字符串不超过30个字符),表示n个同学的姓名。
【输出形式】
输出出现次数最多(相同则分行一起输出)的字母字符和次数,并用空格隔开。
【样例输入1】
1
zhang zhe
【样例输出1】
h 2
z 2
【样例输入2】
3
li hong
wang qiang
zhang tao
【样例输出2】
a 4
g 4
n 4

#include <iostream>
#include <string>
using namespace std;
int main(){
int i,j,rs,char name[100][100];
int xb[26]={0};
cin>>rs;//人数 
//循环输入rs个字符串 ,可读入空格 
for(i=0;i<rs;i++){
cin.getline(name[i],100); }
for(i=0;i<rs;i++)
    for(j=0;name[i][j]!="\n";j++)
      if(name[i][j]!=' ') //空格不管 
      xb[name[i][j]-'a']++;//下标为对应的ASCLL码值数组加1 

return 0;
} 

目前敲出来这么多,希望可以进行补充,如果有错帮指出,(我定义的是字符数组,可改用string类型的一维数组)有注释就更完美了,谢谢!!

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2021-09-10 09:31
    关注

    修改如下,供参考:

    #include <iostream>
    #include <string>
    using namespace std;
    int main() {
        int i, j, rs, max;
        char name[100][100];
        int xb[26] = { 0 };
        cin >> rs;//人数 
        //循环输入rs个字符串 ,可读入空格 
        for (i = 0; i < rs; i++) {
            cin.ignore();
            cin.getline(name[i], 100);
        }
        for (i = 0; i < rs; i++)
            for (j = 0; name[i][j] != '\0'; j++)//for (j = 0; name[i][j] != "\n"; j++)
                if (name[i][j] >= 'a' && name[i][j] <= 'z')//if (name[i][j] != ' ') //空格不管 
                    xb[name[i][j] - 'a']++;//下标为对应的ASCLL码值数组加1 
        max = xb[0];
        for (i = 1; i < 26; i++)
            if (max < xb[i]) max = xb[i];
        for (i = 0; i < 26; i++)
            if (xb[i] == max)
                cout << (char)(i + 'a') << " " << xb[i] << endl;
        return 0;
    }
    
    

    再改进下,少一次循环,供参考:

    #include <iostream>
    #include <string>
    using namespace std;
    int main() {
        int i, j, rs, max = 0;
        char name[100][100];
        int xb[26] = { 0 };
        cin >> rs;//人数 
        //循环输入rs个字符串 ,可读入空格 
        for (i = 0; i < rs; i++) {
            cin.ignore();
            cin.getline(name[i], 100);
        }
        for (i = 0; i < rs; i++)
        {
            for (j = 0; name[i][j] != '\0'; j++)
                if (name[i][j] >= 'a' && name[i][j] <= 'z') 
                { 
                    xb[name[i][j] - 'a']++;
                    if (max < xb[name[i][j] - 'a']) 
                        max = xb[name[i][j] - 'a'];
                }
        }
        for (i = 0; i < 26; i++)
            if (xb[i] == max)
                cout << (char)(i + 'a') << " " << xb[i] << endl;
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月21日
  • 已采纳回答 9月13日
  • 创建了问题 9月10日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大