编程之美系列(3)
来源:互联网 发布:中国社交软件排行 编辑:程序博客网 时间:2024/04/29 06:44
“水王”问题:在一个论坛里,有N个ID发帖,其中一个ID发的帖子数超过了论坛总贴数的一半,现在要从N各ID中找出这个“水王”ID。
如果每次删除两个不同的ID(不管是否包含“水王”的ID),那么,在剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。可以不断重复
这个过程,把ID列表中的总数降低(转化为更小的问题),从而得到答案。
int Find(int *ID,int N){ int candidate; int i,nTimes; for(i = nTimes = 0; i < N; ++i) { if(nTimes == 0) { candidate = ID[i];//因为水王发帖总数超过了一半多,所以最终的ID[i]就是水王的ID nTimes = 1; } else { if(candidate == ID[i]) nTimes++; else nTimes--; } } return candidate;}
我自己想的一种方法就是用位图bitmap。声明一个bitmap数组,用ID列表中的ID作为bitmap数组的索引,并将bitmap对应为加1。
在遍历完ID列表中的ID后,再在bitmap中找出最大的值,最大数值对应的ID号即为水王了。
源代码如下:
int Find(int *ID,int N){ int candidate; int i; int max = -1; int *bitmap; bitmap = (int *) malloc(sizeof(int) * N); memset(bitmap,0,N); for(i = 0; i < N; ++i) { bitmap[ID[i]]++; } for(i = 0; i < N; ++i) { if(bitmap[ID[i]] > max) { max = bitmap[ID[i]]; candidate = ID[i]; } } return candidate;}
- 编程之美系列(3)
- 编程之美系列(1)
- 编程之美系列(2)
- 编程之美系列(4)
- 编程之美系列(5)
- 编程之美系列(5)
- 编程之美 3.11二分查找系列
- 编程之美系列之关于数组的二分查找
- 编程之美系列之寻找最大的K个数
- 编程之美系列之二叉树的分层遍历
- 编程之美系列之计算字符串的相似度
- 编程之美系列之寻找最大的K个数
- 读书日记之编程之美系列(一)
- 编程之美系列: 3.9 重建二叉树
- 数学之美系列3(转帖)
- 数学之美系列
- 数学之美系列
- 编程之美3:最大公约数问题
- Unity3D 现状分析及简单介绍
- Windows多线程编程实现数据互斥访问的几个方法
- [转]暖风
- GridView自定义分页的四种存储过程
- SQL中 inner join、 left join 、right join、 outer join之间的区别[zz]
- 编程之美系列(3)
- 最常用和实用的CSS技巧[zz]
- 在C#.net中如何操作XML
- 快速通过CMMI评估
- 车牌识别及验证码识别的一般思路[zz]
- 觉得好,偷来的
- 图像缩放双线性插值算法[zz]
- ITPUB系列调查 DBA的压力究竟有多大
- 在Ubuntu9.10上折腾Maemo SDK5的过程