编程之美系列(3)

来源:互联网 发布:中国社交软件排行 编辑:程序博客网 时间:2024/04/29 06:44

     “水王”问题:在一个论坛里,有N个ID发帖,其中一个ID发的帖子数超过了论坛总贴数的一半,现在要从N各ID中找出这个“水王”ID。

如果每次删除两个不同的ID(不管是否包含“水王”的ID),那么,在剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。可以不断重复

这个过程,把ID列表中的总数降低(转化为更小的问题),从而得到答案。

int Find(int *ID,int N){    int candidate;    int i,nTimes;    for(i = nTimes = 0; i < N; ++i)    {        if(nTimes == 0)        {            candidate = ID[i];//因为水王发帖总数超过了一半多,所以最终的ID[i]就是水王的ID            nTimes = 1;        }        else        {            if(candidate == ID[i])                nTimes++;            else                nTimes--;        }    }    return candidate;}

    我自己想的一种方法就是用位图bitmap。声明一个bitmap数组,用ID列表中的ID作为bitmap数组的索引,并将bitmap对应为加1。

在遍历完ID列表中的ID后,再在bitmap中找出最大的值,最大数值对应的ID号即为水王了。

源代码如下:

int Find(int *ID,int N){    int candidate;    int i;    int max = -1;    int *bitmap;        bitmap = (int *) malloc(sizeof(int) * N);    memset(bitmap,0,N);    for(i = 0; i < N; ++i)    {        bitmap[ID[i]]++;    }    for(i = 0; i < N; ++i)    {        if(bitmap[ID[i]] > max)        {            max = bitmap[ID[i]];            candidate = ID[i];        }    }    return candidate;}
原创粉丝点击