数组中超过出现次数超过一半的数字
2012-08-27 17:19
232 查看
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
思想:我们假设存在这样的数字,次数超过一半,那么那个数的次数减去其它数字的次数一定大于0.
说白了就是:从前到后,碰到两个不两同的数,我们就删了它们,当然不是真删除,我们可以用一个记数器+一个变量保存频繁出现的值。这样最后得到的数就是要求的。
还有一种比较偷懒的方法,但效率要差,先排序qsort一下,那么中间那个元素一定是所求。
思想:我们假设存在这样的数字,次数超过一半,那么那个数的次数减去其它数字的次数一定大于0.
说白了就是:从前到后,碰到两个不两同的数,我们就删了它们,当然不是真删除,我们可以用一个记数器+一个变量保存频繁出现的值。这样最后得到的数就是要求的。
还有一种比较偷懒的方法,但效率要差,先排序qsort一下,那么中间那个元素一定是所求。
#include <stdio.h> #include <stdlib.h> #include <assert.h> //前提是确实存在这样的数 int findNumFrequencyMoreThanHalf(int *a, int len) { int i, c = 0, freq; assert(a && len>0); for (i = 0; i < len; i++) { if (c == 0) { freq = a[i]; ++c; } else { if (freq == a[i]) ++c; else --c; } } return freq; } int main(void) { int a[]={2,12,23,34,3,3,5,3,4,3,5,3,3,3}; printf("the frequency num is:%d\n",findNumFrequencyMoreThanHalf(a,sizeof(a)/sizeof(int))); return 0; }
相关文章推荐
- 【面试题26】数组中出现次数超过一半的数字
- 关于数组的问题(连续子数组的最大和、数组中出现次数超过一半的数字、调整数组顺序使奇数位于偶数之前)
- 剑指offer-29数组中出现次数超过一半的数字
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
- 面试题33:数组中出现次数超过一半的数字
- 剑指Offer之面试题29:数组中出现次数超过一半的数字
- 面试题29:找到数组中出现次数超过一半的数字(java)
- 面试题29:数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 剑指offer 29题 【时间效率】数组中出现次数超过一半的数字
- 找出数组中出现次数超过一半的数字
- C++算法之 数组中出现次数超过一半的数字
- 面试题29 数组中出现次数超过一半的数字
- 剑指offer面试题29-数组中出现次数超过一半的数字
- 剑指offer 5.2 时间效率1 - 数组中出现次数超过一半的数字
- 剑指Offer29数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 算法题——数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字