码迷,mamicode.com
首页 > 其他好文 > 详细

Cracking the Coding Interview 5.7

时间:2014-08-19 18:49:45      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   for   ar   div   amp   

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;
}

 

Cracking the Coding Interview 5.7,布布扣,bubuko.com

Cracking the Coding Interview 5.7

标签:style   blog   color   io   for   ar   div   amp   

原文地址:http://www.cnblogs.com/johnsblog/p/3922652.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!