Description | ||
有一个通话的记录,请找出联系最多的联系人名字。 输入 第一行是一个整数N,表示样例的个数。 每个样例从”START”开始,”END”结束,其间每行一个联系人的名字,名字都是小写英文,长度不超过16个字符,联系人数不超过20人。 输出 每行输出一个样例的结果,如果有多个名字符合条件,请输出字典序最小的那个人的名字。 | ||
Sample Input | ||
2 START eric john eric END START eric alice END | ||
Sample Output | ||
eric alice |
不太会,读了一下大佬的代码顺便做了个自己理解的注释
#include<stdio.h>
#include<string.h>
char name[20][20],max[20];//用一个二维数组读取字符串
char end[3]={'E','N','D'};
int N,cnt,p,maxp;
int main()
{
scanf("%d",&N);
while(N--)
{
scanf("%s",name[0]);//读取START
cnt=0;//计算每个样例有几个名字
while(1)
{
//判停
scanf("%s",name[++cnt]);//cnt最终可以知道共有几个名字
if(strcmp(name[cnt],end)==0)
break;
}
//调试发现cnt会多加1,所以后续注意要减一
//输出字典序最小的名字,所以要按字典序排列,隐含一个排序
for(int i=cnt-1;i>0;i--)
{
for(int j=1;j<i;j++)
//内层跑一圈是把最大的挪到了最后 (把1挪到了i+1的位置)
{
if(strcmp(name[j],name[j+1])>0)//name[j]的字典序靠后,从小到大的排序
{
char temp[20]={0};
strcpy(temp,name[j]);//复制
strcpy(name[j],name[j+1]);
strcpy(name[j+1],temp);
}
}
}
p=maxp=1;//默认均出现1次
strcpy(max,name[1]);//假设第一个名字是出现次数最多的
//如果重复的名字不是挨着的怎么办(。。。排过序了一样的肯定挨着啊老铁。。。。)
for(int i=2;i<cnt;i++)
{
if(strcmp(name[i],name[i-1])==0)
{
p++;
if(p>maxp)//因为已经按字典序排列过了,即使有两个名字出现次数多,只要不大于最后都是输出字典序较前的那个
{
maxp=p;
strcpy(max,name[i]);
}
}
else
p=1;
}
printf("%s\n",max);
}
return 0;
}
一开始是大佬的代码没看懂,不知道如果相同的名字没挨着该怎么办,才自己写了个两层循环,后来发现,已经排过序了,一样的肯定挨在一起。。。。。