题目
思路:
数给出给定字符串数组中A ,C, D, E, G字母出现的次数,并按出现次数由高到低排列(若次数相同,按字典序排序);若出现次数为0,不输出;
用结构体快排即可;
AC代码
#include <bits/stdc++.h>
using namespace std;
char s[25][25];
struct node
{
char c;
int id;
} a[30];
bool cmp(struct node a,struct node b)//熟悉结构体快排
{
return a.id>b.id;
}
int main()
{
int n,m,i,j;
while(~scanf("%d %d",&n,&m))
{
if(n==0&&m==0) break;
for(i=0; i<n; i++)
cin>>s[i];
a[1].c='A';
a[2].c='C';
a[3].c='D';
a[4].c='E';
a[5].c='G';
for(i=1; i<=5; i++)
a[i].id=0;
for(i=0; i < n; i++)
{
for(j=0; j < m; j++)
{
if(s[i][j]=='A') a[1].id++;
else if(s[i][j]=='C')a[2].id++;
else if(s[i][j]=='D')a[3].id++;
else if(s[i][j]=='E')a[4].id++;
else if(s[i][j]=='G')a[5].id++;
}
}
sort(a+1,a+6,cmp);
int c=0;
for(i=1; i<=5; i++)//以下是和队友学习的方法
{
if(a[i].id!=0)
c++;//计算出现次数不为0的字母数
}
int num=0;
for(i=1; i<=5; i++)
{
if(a[i].id!=0)
{
num++;
if(num<c)
printf("%c %d ",a[i].c,a[i].id);//不是最后一个需要加空格控制
else printf("%c %d",a[i].c,a[i].id);
}
}
printf("\n");//wrong了好多次,错在这里忘记加换行;
}
return 0;
}