课堂练习--找“水王”
一、题目要求
现有一个灌水论坛,信息学院的学生都喜欢在上面交流灌水。传说在论坛上有一个“水王”,它不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目已超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者ID在其中,请设计算法快速找到这个传说中的“水王”。
二、设计思路
本题要求时间复杂度是o(n),我们可以设置一个计数器flag,和一个变量shuiwang存放当前的ID,当flag为0时,将arry[i]赋给shuiwang,否则,比较i和i+1,相等flag+1,不等flag-1。
三、源代码
1 #include "stdio.h" 2 #define N 1000 3 int main() 4 { 5 int arry[N],shuiwang,flag,num,i; 6 printf("请输入ID的个数:"); 7 scanf("%d",&num); 8 printf("请输入ID:\n"); 9 for(i=0;i<num;i++) 10 { 11 scanf("%d",&arry[i]); 12 } 13 for(i=flag=0;i<num;i++) 14 { 15 if(flag==0) 16 { 17 shuiwang=arry[i],flag=1; 18 } 19 else 20 { 21 if(shuiwang==arry[i]) 22 { 23 flag++; 24 } 25 else 26 { 27 flag--; 28 } 29 } 30 } 31 printf("这个“水王”的ID就是:"); 32 printf("%d\n",shuiwang); 33 return 0; 34 }
四、结果截图
五、实验心得
课堂上,老师让我们先从简单的方法开始,先排序中间的就是水王,而后,加大难度,我觉得这种思维正是我们在编程过程中应该具备的,先实现基本功能,再优化代码。然后说说这道题目,开始绞尽脑汁都没有想到,后来老师说可以采用“消消”的方法,恍然大悟...再实现时却不是那么回事,我发现面对不同的情况消得对象不同,比如“1,1,1,1,2,2,2”和“1,2,1,2,1,2,1”就不同,后来又跟小伙伴商量,探讨,查资料,才找到了分情况的办法,锻炼了我们的思维能力。