首页 > 代码库 > Cracking the Coding Interview 5.7
Cracking the Coding Interview 5.7
An array A[1...n] contains all the integers from 0 to n except for one number which is missing.In this problem, we cannot access an entire integer in A with a single operation. The elements of A are represented in binary, and the only operation we can use to access them is "fetch the jth bit of A[i]", which takes constant time. Write code to find the missing integer. Can you do it in O(n) time?
以0-5,少了3为例:
000
001
010
011
100
101
首先观察最后一位,由于数是从0开始的,因此,如果没有去掉一个数,0的数目应该比一的数目大1(奇数个数)或者相等(偶数个数)。现在的具体情况是3个0,2个1,因此去掉的数的最后一位一定是1,因为如果为0,那么就有4个0和2个1,显然不合理。
这样,我们就可以排除最后一位不是1的数,这些数都是存在的,即不可能是所求。
000
001
010
011
100
101
现在来看倒数第二位,2个0,0个1,因此去掉的数的倒数第二位一定是1。
排除倒数第二位不是1的数
000
001
010
011
100
101
此时A[]里的数已经全部被排除了,那么结果就是最后一位和倒数第二位为1,其余为0的数,即011
#include<stdio.h>int fetch(int i,int j)//获取整数i的第j位{ if(j>32 || j<0) { return 0; } else { return (i>>j)&1; }}int func(int colum,int *A,int len)//colum是倒数第几位,len是数组A的长度{ if(len == 0) { return 0; } int cnt0,cnt1;//colum位有几个1,几个0 cnt0=0; cnt1=0; for(int i=0;i<len;i++) { if((fetch(A[i],colum)&1) > 0) { cnt1++; } else { cnt0++; } } int *A1,*A0; if(cnt1>0) { A1 = new int[cnt1]; } else { A1=NULL; } if(cnt0>0) { A0 = new int[cnt0]; } else { A0=NULL; } cnt1=0; cnt0=0; for(int i=0;i<len;i++)//将colum位为1的和为0的分别放在两个新的数组A1,A0中 { if((fetch(A[i],colum)&1) > 0) { A1[cnt1] = A[i]; cnt1++; } else { A0[cnt0] = A[i]; cnt0++; } } if(cnt1>=cnt0)//结果的colum位为0 { return func(colum+1,A0,cnt0); } else//结果的colum位为1 { return (1<<colum)+func(colum+1,A1,cnt1); } delete[]A1; A1 = NULL; delete[]A0; A0 = NULL;}int main(){ int A[]={0,1,2,3,4,6,7,8,9,10,11}; printf("%d\n",func(0,A,sizeof(A)/sizeof(int))); return 0;}