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