寻找水王
一、问题描述
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他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; }
四、实现截图
五、个人总结
要学会将一个规模很大的问题转化成若干个容易解决的小问题