一、实验要求
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?要求时间复杂度为O[N]。
二、设计思想
排序法:由于该“水王”发帖数目超过了帖子数目的一半,将列表中的ID从小到大进行排序,则中间的ID即为水王。但由于其时间复杂度不满足要求,因此需要采用更便捷的方法。
每次删除两个不同的数,因为“水王”发帖数过半,因此删除这俩数后“水王”发帖数依旧过半,若两ID相同则利用标志key++,key>0且两ID不同时key--。具体实现过程如下:
三、代码
1 // KingofNavy.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include"iostream" 6 using namespace std; 7 8 int main() 9 { 10 int key=0; 11 int king=0; 12 int i=0; 13 int array[]={5,5,3,5,3,3,3,5,3,3,4,3,2,3,5,3,7,3,3,2,3}; 14 for(i=0;i<20;i++) 15 { 16 if(key==0) 17 { 18 king=array[i]; 19 cout<<"Now the King of Navy is:"<<array[i]<<endl; 20 key=1; 21 } 22 else 23 { 24 if(king==array[i]) 25 { 26 key++; 27 } 28 else 29 { 30 key--; 31 } 32 } 33 } 34 cout<<"The ID of King of Navy is:"<<king<<"!"<<endl; 35 cout<<"OVER..."<<endl; 36 return 0; 37 }
四、测试结果
五、总结
遍历的方法很简单,但不总是符合要求,因此,多一些思考问题的方式总是好的。