您的位置:首页 > 其它

寻找发帖水王扩展问题

2014-04-26 19:44 183 查看
编程之美一书中寻找发帖“水王“的扩展问题描述如下:

统计结果表明,有3个发帖很多的ID,它们的发帖数码都超过了帖子总数目的N的1/4。你能从发帖ID列表中快速找出它们的ID吗?

参考书中”超级水王“的求解方案,我们每次删除4个不同的ID(不管是否包含题设中的3个ID),那么在剩下的ID列表中,题设中的3个ID各自出现的次数依旧超过总ID数的1/4,我们通过代码demo.cpp来找出题设中的3个ID:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
int inputNum,idValue[3],idCounts[3] = {0,0,0};
vector<int> intVec;

cout << "Please input some intergers and enter ctrl+d to end input:" << endl;
while(cin >> inputNum)
intVec.push_back(inputNum);

for(vector<int>::size_type index = 0; index != intVec.size(); index++)
{

if(idCounts[0] && idValue[0] == intVec[index])
{
idCounts[0]++;
}
else if(idCounts[1] && idValue[1] == intVec[index])
{
idCounts[1]++;
}
else if(idCounts[2] && idValue[2] == intVec[index])
{
idCounts[2]++;
}
else if(0 == idCounts[0])
{
idValue[0] = intVec[index];
idCounts[0]++;
}
else if(0 == idCounts[1])
{
idValue[1] = intVec[index];
idCounts[1]++;
}
else if(0 == idCounts[2])
{
idValue[2] = intVec[index];
idCounts[2]++;
}
else                              //与当前3个id都不相等,则从列表中删除这4个元素
{
idCounts[0]--;
idCounts[1]--;
idCounts[2]--;
}
}

cout << "the result is: " << idValue[0] << " " << idValue[1] << " " << idValue[2] << endl;
return 0;
}


在该程序中,数组idValue[3]用来存放题设中要求的3个ID的值,数组idCounts[3]用来存放当前情况下,idValue[3]中对应ID的个数,初始化均为为0。

在for循环中,首先判断当前处理的ID值是否与idValue[3]中某个元素相等,如果都不相等,那么就考虑下是否是由于idCounts[3]中某个元素不含ID导致的,如果数组idCounts[3]里的元素均大于0,那么这时刚好满足删除4个不同ID的条件,将idCounts[3]里的元素各自减一即可。最后剩下来的元素一定都是由题设要求的3个ID所组成的。

测试文件test.txt内容:

1 3 1 8 2   3 8 1 4 3   1 3 8 6 3   2 8 8 1 3   10 1 8


测试结果:

$ ./demo < test.txt
$ the result is: 1   3   8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: