XTU-OJ 1133 最近联系人

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;
 } 

一开始是大佬的代码没看懂,不知道如果相同的名字没挨着该怎么办,才自己写了个两层循环,后来发现,已经排过序了,一样的肯定挨在一起。。。。。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值