寻找发贴‘水王’中扩展题为:
随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?
解答:这道题显然还是用原题中的思路去解决,但问题复杂了,由原来的一个水王,变成了3个:
首先,我们需要3个变量来记录当前遍历过的3个不同的ID,number1,number2,number3,这3个元素分别对应当前遍历过的3个ID出现的个数。如果遍历中有某个ID不同于这3个当前ID,我们就判断当前3个ID是否有某个的number为0,如果有,那这个新遍历的ID就取而代之,并设置对应的number为1;如果当前3个ID的number皆不为0,则3个ID的number都减去1。
void find_top3_water_king(int arr[], int arrSize)
{
int number1 = 0, number2 = 0, number3 = 0;
int waterk1 = 0, waterk2 = 0, waterk3 = 0; /* they are different between each other */
for (int index = 0; index < arrSize; ++index)
{
if (number3 == 0)
{
waterk3 = arr[index];
++number3;
continue;
}
else if (number2 == 0 && arr[index] != waterk3 )
{
waterk2 = arr[index];
++number2;
continue;
}
else if (number1 == 0 && arr[index] != waterk3 && arr[index] != waterk2 )
{
waterk1 = arr[index];
++number1;
continue;
}
else
{
if (arr[index] == waterk1)
++number1;
else if (arr[index] == waterk2)
++number2;
else if (arr[index] == waterk3)
++number3;
else
{
--number1;
--number2;
--number3;
}
}
}
cout << "The big 3 water king is " << waterk1 << "," << waterk2 << "," << waterk3 << endl;
}