编程珠机 第二章 找出一个不在文件中一32位整数。
来源:互联网 发布:深渊巨口皮肤淘宝 编辑:程序博客网 时间:2024/06/06 03:34
给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中一32位整数。
该题目有2个问题,
1, 在内存足够的情况下, 使用位图法就可以 但是需要500多M的内存空间
2. 在没有足够内存的情况下 如何解决, 采用二分法。
思考: 是否可以从第三轮就得到想要的结果 不再循环下去,否则一直要等待bit最后一位循环结束!
第一轮
splitA1 8 13
splitA2 2 3 4 5
a = splitA1 calDeep 6
res = 8
第二轮
splitA1 13
splitA2 8
res = 12 calDeep 8
a = splitA1
第三轮
splitA1 13
a = splitA1
res = 14 calDeep 9
第四轮
splitA1 13
a = splitA1
res = 15 calDeep 10最终的结果为15!
#include<stdio.h>
// 这个版本的问题是空间占用也很大, 另外需要2个数组。
int getNumber(int* a, int* splitA1, int* splitA2, int lenA, int bit)
{
int res = 0;
int i, A1n, A2n;
int calDeep =1;
while(bit-- > 0)
{
for(i = A1n = A2n =0; i < lenA; i++)
{
//if((a[i]>>(bit))==1) 此处有bug, 如果13 的话 13>>2 为3 在第二轮中还是不能进入到splitA1
if((a[i] & (1<<bit)))
{
splitA1[A1n++]=a[i];
}else
{
splitA2[A2n++]=a[i];
}
calDeep++;
}
if(A1n <= A2n)
{
res += 1<< bit;
a = splitA1;
lenA = A1n;
}else
{
a = splitA2;
lenA = A2n;
}
}
printf("The over all calculator deep is %d\n", calDeep);
return res;
}
void main(){
int a[6]= {2,3,4,5,8,13};
int A1[3] ={};
int A2[3]= {};
int res = getNumber(a,A1,A2,6,4);
printf("find the num that is not stored is %d\n",res);
}
最新版本代码去掉了2个数组!
#include<stdio.h>
int getNumber(int* a, int lenA, int bit)
{
int res = 0;
int i, A1n, A2n;
int calDeep =1;
int countPre;
int countNext;
int* p = a;
int n = bit;
while(bit-- > 0)
{
for(i = countPre = countNext =0; i < lenA; i++)
{
if(*(p+i) & (1<<bit))
{
countPre++;
} else {
countNext++;
}
calDeep++;
}
if (countPre <= countNext)
{
res += 1<< bit;
p = a+countNext;
lenA = countPre;
} else {
lenA = countNext;
}
printf("res = %d\n", res);
}
printf("The over all calculator deep is %d\n", calDeep);
return res;
}
void main(){
int a[6]= {2,3,4,5,8,15};
int res = getNumber(a,6,4);
printf("find the num that is not stored is %d\n",res);
}
// 这个版本的问题是空间占用也很大, 另外需要2个数组。
int getNumber(int* a, int* splitA1, int* splitA2, int lenA, int bit)
{
int res = 0;
int i, A1n, A2n;
int calDeep =1;
while(bit-- > 0)
{
for(i = A1n = A2n =0; i < lenA; i++)
{
//if((a[i]>>(bit))==1) 此处有bug, 如果13 的话 13>>2 为3 在第二轮中还是不能进入到splitA1
if((a[i] & (1<<bit)))
{
splitA1[A1n++]=a[i];
}else
{
splitA2[A2n++]=a[i];
}
calDeep++;
}
if(A1n <= A2n)
{
res += 1<< bit;
a = splitA1;
lenA = A1n;
}else
{
a = splitA2;
lenA = A2n;
}
}
printf("The over all calculator deep is %d\n", calDeep);
return res;
}
void main(){
int a[6]= {2,3,4,5,8,13};
int A1[3] ={};
int A2[3]= {};
int res = getNumber(a,A1,A2,6,4);
printf("find the num that is not stored is %d\n",res);
}
最新版本代码去掉了2个数组!
#include<stdio.h>
int getNumber(int* a, int lenA, int bit)
{
int res = 0;
int i, A1n, A2n;
int calDeep =1;
int countPre;
int countNext;
int* p = a;
int n = bit;
while(bit-- > 0)
{
for(i = countPre = countNext =0; i < lenA; i++)
{
if(*(p+i) & (1<<bit))
{
countPre++;
} else {
countNext++;
}
calDeep++;
}
if (countPre <= countNext)
{
res += 1<< bit;
p = a+countNext;
lenA = countPre;
} else {
lenA = countNext;
}
printf("res = %d\n", res);
}
printf("The over all calculator deep is %d\n", calDeep);
return res;
}
void main(){
int a[6]= {2,3,4,5,8,15};
int res = getNumber(a,6,4);
printf("find the num that is not stored is %d\n",res);
}
- 编程珠机 第二章 找出一个不在文件中一32位整数。
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数
- 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。
- 在一个包含40亿个随机排列的32位整数的顺序文件中(注意随机排序),找出一个不再文件中的32位整数
- 100亿个32位整数中放到一个文件中,找出任一个重复出现的数
- 编程珠玑 第二章 习题 2 给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 找出一个整数数组中,第二大的数
- 找出一个整数数组中第二大的数
- 《编程珠玑》第二章三个问题A---查找40亿个32位整数中缺失的某个整数
- 给定包含4300000000个32位整数的顺序文件,如何找出一个出现至少两次的整数
- 找出整数数组中第二大数
- 写一个函数找出一个整数数组中,第二大的数
- 写一个函数找出一个整数数组中,第二大的数 (microsoft)
- 写一个函数找出一个整数数组中,第二大的数(microsoft)
- 写一个函数找出一个整数数组中,第二大的数
- 写一个算法实现在一个整数数组中,找出第二大的那个数字。
- 写一个函数找出一个整数数组中,第二大的数
- C++面试题之写一个函数找出一个整数数组中,第二大的数
- windows+cygwin+eclipse运行时jdk的配置问题
- android EditText和TextView出现中文、英文等string串的排版问题
- uva 10499
- poj 1456 Supermarket
- hdu 4276 树形dp背包
- 编程珠机 第二章 找出一个不在文件中一32位整数。
- android 自定义toast
- 图文解说redmine使用指南
- 记事本
- 飘逸的python - 发送qq邮件
- 小米的红米战略:告别苹果走向三星
- poj 2612 Mine Sweeper
- WIN32无边框窗体的缩放、移动与WM_NCHITTEST消息&&UpdateLayeredWindow重要心得
- 总结J2EE项目开发10大风险