100亿个32位整数中放到一个文件中,找出任一个重复出现的数
2014-06-04 22:27
639 查看
问题描述是这样的:
在一个文件中存放有100亿个整数,每个整数都是32位,因为32位整数最多表示40亿,所以其中一定有重复出现的数。快速找到这样的任意一个数即可。
思路如下:
32个bit可以分为两段,高16bit看做前缀,那么这其中至少有一个前缀一定出现超过2^16次,否则的话就没有重复的数了。那么我们就先把出现次数超过2^16次方
的前缀找出来。然后遍历文件中的所有数,统计拥有该前缀的数的低16位是否重复出现过。只要重复出现过,那么这个数就是我们要找的数。
代码如下:
int iPrefix[1 << 16];
memset(&iPrefix, 0, sizeof(iPrefix));
unsigned int iNum = 0;
unsigned int iDupPrefix = 0;
//从头开始遍历所有的数,找到有重复数的前缀,放到iDupPrefix
while(GetOneNum(&iDupPrefix ) >= 0)
//遍历以iDupPrefix为前缀的数,找到重复数
在一个文件中存放有100亿个整数,每个整数都是32位,因为32位整数最多表示40亿,所以其中一定有重复出现的数。快速找到这样的任意一个数即可。
思路如下:
32个bit可以分为两段,高16bit看做前缀,那么这其中至少有一个前缀一定出现超过2^16次,否则的话就没有重复的数了。那么我们就先把出现次数超过2^16次方
的前缀找出来。然后遍历文件中的所有数,统计拥有该前缀的数的低16位是否重复出现过。只要重复出现过,那么这个数就是我们要找的数。
代码如下:
int iPrefix[1 << 16];
memset(&iPrefix, 0, sizeof(iPrefix));
unsigned int iNum = 0;
unsigned int iDupPrefix = 0;
//从头开始遍历所有的数,找到有重复数的前缀,放到iDupPrefix
while(GetOneNum(&iDupPrefix ) >= 0)
{ <span style="white-space:pre"> </span>iDupPrefix >>= 16; <span style="white-space: pre;"> </span>iPrefix[iDupPrefix ]++;
<span style="white-space: pre;"> </span>if(iPrefix[iDupPrefix ] > (1 << 16))
<span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>break; <span style="white-space:pre"> </span>} }
iDupPrefix <<= 16;
memset(iPrefix, 0, sizeof(iPrefix));
//遍历以iDupPrefix为前缀的数,找到重复数
while(GetOneNum(&<span style="font-family: Arial, Helvetica, sans-serif;">iNum</span>) >= 0) { iNum ^= iDupPrefix; if (iNum < (1 << 16)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>iPrefix[iDupPrefix ]++; <span style="white-space:pre"> </span>if(iPrefix[iDupPrefix ] > (1 << 16)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> printf("find number:%u", iNum);</span>
<span style="white-space:pre"> </span>break; <span style="white-space:pre"> </span>} }
相关文章推荐
- 新解:给定包含4 300 000 000个32位整数的顺序文件,如何找出一个至少出现两次的整数。
- 给定包含4300000000个32位整数的顺序文件,如何找出一个出现至少两次的整数
- 实现一个位图、100亿个整数找出只出现一次的整数、找出现次数不超多2次的数
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数
- 软件开发者面试百问-----有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
- 编程珠机 第二章 找出一个不在文件中一32位整数。
- 计数排序——有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。
- 一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1
- 在一个包含40亿个随机排列的32位整数的顺序文件中(注意随机排序),找出一个不再文件中的32位整数
- 算法-在1001个整数中找出一个重复出现的数字
- 一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?
- 在一个文件中有10G个整数,乱序排列,要求找出中位数
- 今天大家做的一个比赛题:有6个文件,每个文件里大约200w整数,每行一个找出所有文件里最大的一个数字
- 16、JAVA 找出一个字符串中,第一个重复出现的字符
- 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.
- 腾讯面试题:服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。
- 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个
- 15、一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。