您的位置:首页 > 其它

课堂作业——找水军

2015-04-25 13:19 239 查看
题目:

  随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?

思路:

  编程之美的扩展了这个问题,在求解找出一个“水王”的基础上进行补充分析,之前遍历数组的时候只用保存两个值:一个是数组中的ID,一个是它对应出现的次数。而这次需要找出3个ID(即输出3个结果),就需要另开辟新的数组来分别保存。首先保存前3个ID,每当遍历下一个ID的时候,先要判断下一个和当前保存的这3个ID是否有相同的,若有相同的则此ID对应的次数加1;若不同则次数减1。再判断如果有ID次数为零,就用下一个ID把它替换,并把次数设为1。与之前不同的是,可能会出现次数都不为0的情况,这时就将所有的次数都减1。

源代码:

#include<iostream.h>
#define N 16
class Type
{
public:
Type()
{
count=0;
id=-1;
}
int count;
int id;
};
int main()
{
int ID
={7,10,7,4,5,5,10,7,7,7,10,10,5,5,10,4};
Type candidate1;
Type candidate2;
Type candidate3;
int i;
for(i=0;i<N;i++)
{
if(ID[i]==candidate1.id)
{
candidate1.count++;
}
else if(ID[i]==candidate2.id)
{
candidate2.count++;
}
else if(ID[i]==candidate3.id)
{
candidate3.count++;
}
else if(candidate1.count==0)
{
candidate1.id=ID[i];
candidate1.count++;
}
else if(candidate2.count==0)
{
candidate2.id=ID[i];
candidate2.count++;
}
else if(candidate3.count==0)
{
candidate3.id=ID[i];
candidate3.count++;
}
else
{
candidate1.count--;
candidate2.count--;
candidate3.count--;
}
}
cout<<candidate1.id<<endl;
cout<<candidate2.id<<endl;
cout<<candidate3.id<<endl;
return 0;
}


View Code

运行结果:



总结:

  因为还要考虑时间复杂度,所以就按照上次的代码进行修改,每次把当前保存的三个ID分别展开(if...else),与下一个ID进行比较,在对其对应的次数操作加、减。

  在论坛上看见有用类和结构体来定义新数组的,这样就不会每次比较时还要遍历新的数组,缩短了时间复杂度。很久没涉及了,现在看到又回忆起来了一些,温故而知新,也知道了什么时候可以用什么结构和方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: