Description
有一个通话的记录,请找出联系最多的联系人名字。
输入
第一行是一个整数N,表示样例的个数。
每个样例从”START”开始,”END”结束,其间每行一个联系人的名字,名字都是小写英文,长度不超过16个字符,联系人数不超过20人。
输出
每行输出一个样例的结果,如果有多个名字符合条件,请输出字典序最小的那个人的名字。
Sample Input
2 START eric john eric END START eric alice ENDSample Output
eric alice
解题思路: strcmp() 、 strcpy() 两个c库函数(自学)。 头文件 #include <string.h>
先处理输入,当 输入字符串 == "END" 时停止输入。 然后对名字根据字典序进行排序,其余看代码注释。
字典序:从字符第一位开始往后依次比较,同位次中,字符较小的,字典序小。a < b、 aa < ab 、 aab < aba。
#include <stdio.h>
#include <string.h>
int N,cnt,p,maxP;
char name[22][20],maxPeople[20];
char flag[5] = {'E','N','D'};
int main()
{
scanf("%d",&N);
while ( N --)
{
cnt = 0;
scanf("%s",name[0]); // 输入 START;
while (1)
{
scanf("%s",name[++cnt]);
if (strcmp(name[cnt],flag) == 0) break; // 输入 END后停止输入
}
for (int i = cnt-1; i > 0; i --) // 冒泡排序(让名字按字典序排序)
{
for (int j = 1; j < i; j ++)
{
if (strcmp(name[j],name[j+1]) > 0)
{
char t[20] = {0};
strcpy(t,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],t);
}
}
}
p = maxP = 1; // 默认输出第一个人
strcpy(maxPeople,name[1]);
for (int i = 2; i < cnt; i ++)
{
if (strcmp(name[i],name[i-1]) == 0) // 如果后面的和前面的是同一个人,计数++
{
p ++;
if (p > maxP) // 如果这个人出现次数最多,记录下来
{
maxP = p;
strcpy(maxPeople,name[i]);
}
}
else
p = 1; // 如果前后不是同一个人,则重新计数
}
printf("%s\n",maxPeople);
}
return 0;
}
952

被折叠的 条评论
为什么被折叠?



