[微软面试100题]31-40

第三十六题:比赛排名

void match(int w[][8],int *order,int *result,int n){
    memcpy(result,order,n*sizeof(int));
    int round=n;
    while(round>0){
        for(int i=0,j=0;i<round;i+=2,++j){
                if(w[result[i]][result[i+1]]==result[i])swap(i,j,result);
                else swap(i+1,j,result);
        }
    round/=2;
    }
}

第三十八题:有大量的url,去除重复的

1、如果可以全部放入内存,则时候hash table即可
2、如果不能,则根据hash值分为k个bin存硬盘,每个bin可以放入内存中。然后再对每个bin用hash table。
 
第四十题:首尾相连的珠子,找出包含所有颜色的最短子串
用一个长度可变的窗口扫描珠子,如果找到全部颜色且长度比之前找到的更短则更新最优值。
int check(int* color,int thiscolor){//看这颜色有没有
    if(color[thiscolor]!=0)return 1;
    else return 0;
}
int all(int* color,int m){//查看是不是所有颜色都有
    for(int i=0;i<m;++i){
        if(color[i]==0){
            return 0;
        }
    }
    return 1;
}
 
int main()
{
    int a[]={0,1,0,1,2,1,3,1,2,2,3,0};//2,3,1,2,3,2,1,1,3,0,1
    int color[4]={0,0,0,0};
    int m=4;
    int len=sizeof(a)/sizeof(int);
    int b[len];
    for(int i=0;i<2;++i){//首尾相连其实复制数组连起来就可以当做不相连来做
        for(int j=0;j<len;++j)b[i*len+j]=a[j];
    }
    int *begin=b,*end=b;
    int beststart=0,bestlen=2*len;
    while(end!=b+2*len){
        int be=*begin,en=*end;
        color[*end]++;
        while(color[*begin]>1){
            color[*begin]--;
            begin++;
        }
        if(all(color,m) && end-begin+1<bestlen){
            bestlen=end-begin+1;
            beststart=begin-b;
        }
        end++;
    }
    cout<<beststart<<" "<<bestlen<<endl;
}
posted @ 2013-03-28 09:32  iyjhabc  阅读(253)  评论(0编辑  收藏  举报