一、题目与要求
- 题目、三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
- 要求、如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
二、设计思想
排序法:由于该“水王”发帖数目超过了帖子数目的一半,将列表中的ID从小到大进行排序,则中间的ID即为水王。但由于其时间复杂度不满足要求,因此需要采用更便捷的方法。
每次删除两个不同的数,因为“水王”发帖数过半,因此删除这俩数后“水王”发帖数依旧过半,若两ID相同则利用标志key++,key>0且两ID不同时key--。
三、源代码
1 //找水王,信1301-1,李青 2016/5/20 2 #include<iostream> 3 using namespace std; 4 5 int main() 6 { 7 int key = 0; 8 int king = 0; 9 int i = 0; 10 int array[] = { 5, 5, 3, 5, 3, 3, 5, 5, 3, 3, 4, 3, 2, 3, 5, 3, 7, 5, 3, 2, 5}; 11 for (i = 0; i<20; i++) 12 { 13 if (key == 0) 14 { 15 king = array[i]; 16 cout << "目前的水王是:" << array[i] << endl; 17 key = 1; 18 } 19 else 20 { 21 if (king == array[i]) 22 { 23 key++; 24 } 25 else 26 { 27 key--; 28 } 29 } 30 } 31 cout << "水王的ID是:" << king<< endl; 32 return 0; 33 }
四、运行结果:
五、心得体会
这次找水王的程序体现了代码优化的一个重要思想,那就是对于问题的深入分析是优化的前提,由题目我们可以知道,水王是发帖数超过一半的人,所以只要由小到大排序,中间的ID就是水王的ID,但是这样做并不是较为优质的解法,通过比较并删除不同的ID最后得到的也是水王的ID,这种解法就比较符合简洁、高效的原则了。