编程珠玑 第二章

A.给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中一32位整数。
bit那个地方不理解,写在注释里了
int get_lost(int *a, int *b, int *c, int alen, int bit)
{
int re = 0, v = 0, biter = 0, *t, citer, i = 0;
if (!a || !b || alen ==(unsigned long)( (1<< bit))) return -1; //哪个数与最多可能拥有个数相等的时候,直接返回了。

    while (bit--)  
    {  
        v = (1 << bit);  //并不知道为什么,bit=位数?为什么要左移?
        for (biter = citer = i = 0; i < alen; ++i)  
        {  
            if (a[i] & (1 << bit)) b[biter++] = a[i];//若这一位是1,把这个数存到b,标志+1
            else c[citer++] = a[i];  //存到c,标志+1
        }  
        if (biter <= citer)  //比较bc中哪数组长,如果b短,说明缺少的数在b中
        {  
            re += v;  //缺少的数的这一位写上
            t = a; a = b; b = t;  //交换ab,即现在待检索的是b了
            alen = biter;  
        }  
        else  
        {  
            t = a; a = c; c = t;  //不用写上这一位因为是0,交换ac
            alen = citer;  
        }  
    }  
    return re;  
}  

B.字符串循环移位

比如abcdef 左移三位,则变成defabc

static void res(char *a,int n){
    char t;int i=0;j=n-1;
    while(i<j){
        t=a[i];a[i]=a[j];a[j]=t;
        ++i;++j;
    }
}
char *rever(char *a,int n,int len){
    int i,j;
    if(!a||!n)return a;
    res(a,n-1);
    res(a+n,len-n);
    res(a,n);
    return a;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值