问题描述:

Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?

书中第一种方法是先对ID进行排序,再遍历排序后的序列,统计每个ID的次数,从而寻找到最大次数的ID。不过还是第二种方法好些。

思路:

采用题目已知的水王发帖数超过一半这个特殊情况处理本题。考虑如下特殊情况:N个帖子,水王的帖子都在最前面,也就是。

1  2  3   4   5   …  N/2, N/2+1,…  N 。假如在N/2+1之前都是水王的帖子。

如果从一开始假定第一个 ID就为水王并记录,然后对应的次数一直加到N/2+1,往后都不是水王的帖子了,遍历时把水王的帖子数逐个减下去,知道最后,水王的帖子依然大于0。

这是特殊情况,实际情况,水王的帖子应该是分布在所有帖子其中的。仔细分析后发现,按照上述做法,到最后帖子数大于0的肯定是水王的帖子。

总结下大致思想就是:假设每个ID都有可能是水王,那么在遍历时这个水王就要遇到一种挑战,可能自己的帖子数是会增加的,也可能是遇到挑战的,帖子数要减少的。这样遍历下来,只有水王的帖子增加的减去遇到挑战的帖子数会是大于0的。其他任何帖子假设为水王时都是禁不起挑战的。

步骤:

1. 可以假设帖子的第一个ID是次数最大的,用candidate记录,次数用nTimes记录。

2. 遍历下一个ID,如果跟candidate一样,nTimes++,否则,遇到一个挑战,则nTimes–,如果nTimes == 0,下一步就要重复第一步了。

3.遍历结束,nTimes>0的那个candidate就是水王ID,他是获胜者。

01Type Find(Type* ID,int N)

02{

03Type candidate;

04int nTimes, i;

05for(i = nTimes = 0; i < N; i++)

06{

07if(nTimes == 0)

08{

09candidate = ID[i], nTimes = 1;

10}

11else

12{

13if(candidate == ID[i])

14nTimes++;

15else

16nTimes--;

17

18}

19

20}

21return candidate;

22}

此题采用了一种策略,我不知道该称为什么,有点像“对战”,就是假如你很牛,你就要经得起其他人的挑战,如果不行,就要退出,换下一个,直到最后的胜者。

扩展问题:

随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?

这个扩展问题还是上题所述的”对手”问题,不过这次是三个ID同时应战,但是这三个ID之间并不对战。所以问题很快得到解决。

01void Find(Type* ID,int N,Type candidate[3])

02{

03Type ID_NULL;//定义一个不存在的ID

04int nTimes[3], i;

05nTimes[0]=nTimes[1]=nTimes[2]=0;

06candidate[0]=candidate[1]=candidate[2]=ID_NULL;

07for(i = 0; i < N; i++)

08{

09if(ID[i]==candidate[0])

10{

11nTimes[0]++;

12}

13else if(ID[i]==candidate[1])

14{

15nTimes[1]++;

16}

17else if(ID[i]==candidate[2])

18{

19nTimes[2]++;

20}

21else if(nTimes[0]==0)

22{

23nTimes[0]=1;

24candidate[0]=ID[i];

25}

26else if(nTimes[1]==0)

27{

28nTimes[1]=1;

29candidate[1]=ID[i];

30}

31else if(nTimes[2]==0)

32{

33nTimes[2]=1;

34candidate[2]=ID[i];

35}

36else

37{

38nTimes[0]--;

39nTimes[1]--;

40nTimes[2]--;

41}

42}

43return;}

实在是应了那句话,万变不离其宗。万事万物都是有普遍性和特殊性的,特殊性往往是浮于表面的,是动的一面,而普遍性才可能是认识事物的根本,是静的一面。以不变应万变,以静制动,事未行,已然成功大半了。

原文:http://blog.csdn.net/rein07/article/details/6741661

寻找发帖水王java_编程之美–寻找发帖水王 | Acm之家相关推荐

  1. 编程之美-寻找发帖“水王”方法整理

    [试题描述] 方法: 扩展问题:

  2. 编程之美-寻找最大的k个数

    [问题描述] 有很多无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 方法一:时间复杂度min(O(nlogn), O(nk)) idea 1: 先用快速排序或者堆排序进行排序,然后 ...

  3. 编程之美-寻找最近点方法整理

    [问题描述] 方法一:时间复杂度O(n^2) 方法二:时间复杂度O(nlogn) 先用O(nlogn)的排序算法(快排.堆排序.归并排序等)进行排序,然后找最小差值只需要O(n)的时间

  4. 编程之美-寻找数组中的最大值和最小值方法整理

    [试题描述] 方法一:比较2N次 方法二:比较1.5N次 方法三:比较1.5N次 方法四:分治法,比较1.5N次

  5. 中国象棋将帅问题java_编程之美读书笔记1.2——中国象棋将帅问题

    http://blog.csdn.net/pipisorry/article/details/36380669 问题:下过中国象棋的朋友都知道,双方的"将"和"帅&quo ...

  6. 面试难,应聘难,好工作,今安在?——《编程之美——微软技术面试心得》为你探路!即将上市,敬请关注!

    这本书是我目前所见到的优秀面试试题的最全集,包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书."    ...

  7. [编程之美] PSet2.3 寻找发帖“水王”

    问题描述: Tango是微软亚洲研究院的一个试验项目.研究院的员工和实习生们都很喜欢在Tango上面交流灌水.传说,Tango有一大"水王",他不但喜欢发贴,还会回复其他ID发的每 ...

  8. 编程之美-2.3-寻找发帖“水王”

    题目:寻找一个ID列表中,有一个ID超过了总数的一半,找出这个ID 分析: 可以对ID进行排序,因为需要寻找的ID超过了一半,所以该ID列表ID[N]中,ID[N/2]一定是这个ID值.复杂度为O(N ...

  9. 微软编程题:寻找最小的k个值

    转载自:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数 题目描述:5.查找最小的k个元素 题目:输入n个整数,输出其中最小 ...

  10. 编程之美 - 创作后记(部分)

    我应该算是最早知道将要编写<编程之美--微软技术面试指南>这本书的少数几个人之一.那时邹欣老师正在对<移山之道--VSTS开发指南>进行最后的润色,而我还在学校里上研究生课程, ...

最新文章

  1. 用于视力恢复的脑机接口综述(一)(修改)
  2. js中Blob对象一般用法
  3. 【独家】百度移动云高级美女产品经理:O2O日趋火爆,下个估值过亿的上门美业将花落谁家?...
  4. 天天象棋 残局闯关 第20关
  5. 多代理集群调度:可伸缩性和灵活性
  6. 应用在vs的ide调试环境下运行顺利,但是在bin目录直接运行exe报错的问题
  7. iOS设置UIWebView的UserAgent
  8. 安卓清理垃圾清理代码_从战中清理代码
  9. python画图颜色种类_Python可视化|matplotlib07-python colormap(颜色映射)(三)
  10. python 3.5安装pywin32
  11. python 监控网页_python实时监控网页
  12. c语言冒泡例子,C语言排序实例(选择、冒泡、插入、折半、快速)
  13. winform ctrl键单击多选_鼠标各键在CAD中的运用,左右键常用,但滚轮这个功能不一定用过...
  14. 斯坦福大学自然语言处理第三课“最小编辑距离(Minimum Edit Distance)”
  15. TDD (test driver development)测试驱动开发
  16. python算法练习——解空间的穷举搜索与Google方程式
  17. Android体重档案代码,Android开发实现的标准体重计算器功能示例
  18. 致远OA漏洞学习——帆软组件 ReportServer 目录遍历漏洞
  19. 淘宝直通车辅助工具系统使用教程
  20. 可实现一种个人微信二维码收款接口的方法

热门文章

  1. 物化视图基础概念、mview跨库迁移表
  2. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 列表表达式/列表重写...
  3. kafka单机环境搭建
  4. openvswitch安装、基本操作
  5. CTR 预估模型简介--深度学习篇
  6. 基于微服务架构的门户平台改造的研究
  7. 数据--第46课 - 图算法课后练习
  8. 数据--第20课-递归的应用实战二
  9. C++值传递、指针传递、引用传递的区别
  10. Facebook推出高速光网络技术将共享