寻找水王

一、问题描述

  三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。

  如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

二、设计思想

  如果每次删除两个不同的ID,不管删除的ID是否包含“水王”的ID,在剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。可以通过不断重复这个过程,把ID列表中的ID总数降低,最后剩下的一定是水王。

三、代码实现

#include <iostream>
using namespace std;  
  
typedef int Type;  
  
Type find (Type *a, int N)  
{  
    Type candiate;  
    int i, nTimes;  
    for (i = nTimes = 0; i < N; i++)  
    {  
        if (0 == nTimes)  
        {  
            candiate = a[i];  
            nTimes = 1;  
        }  
        else  
        {  
            if (candiate == a[i])  
            {  
                nTimes++;  
            }  
            else  
            {  
                nTimes--;  
            }  
        }  
    }  
    return candiate;  
}   
  
  
int main()  
{  
    Type arr[] = {1, 2, 3, 4, 2, 5, 2, 2, 3, 2, 5, 2};  
    printf("over harf id is %d\n", find(arr, 12));  
    return 0;  
}  

 

四、实现截图

五、个人总结

要学会将一个规模很大的问题转化成若干个容易解决的小问题

posted @ 2016-05-20 17:49  张晓晨  阅读(130)  评论(0编辑  收藏  举报

作者: 张晓晨

出处: https://www.cnblogs.com/420Rock/>

关于作者:专注java与大数据领域,请多多赐教!

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(zhangxiaochen643@sina.com)咨询.