课堂练习——寻找水王

一,题目
•三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
•如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
二,思路

思路1:因为各个人的id号大小不同,因此可将所有人的id号按照从小到大的顺序进行排序,用快速排序法,时间复杂度为:O(N*logN)。然后遍历整个数组,统计每个id号出现的次数,出现次数超过一半的id号即为所求。总的时间复杂度为O(N*logN+N)。

思路2:因为知道前提是水王发帖数目超过总发帖数目的一半,因此,将所有id号从小到大排序完成后,只要找到位于数组中间的id号,肯定为水王的id号。此时时间复杂度缩小到O(N*logN)。

思路3:可以采用我们平时玩的手机游戏小星星的思路,如果上下两个相邻的id号不同,则将其消去,因为水王发帖数目超过总帖数的一半,

因此水王的id号必定前后相邻。这样时间复杂度为O(N).

三,代码

#include <iostream>

using namespace std;

int shuiwang(int arr[], int length)

{     

    int result = arr[0];

    int t = 1;

    for(int i = 1; i < length; ++i)

    {

        if(arr[i] == result)

            t++;

        else

            t--;

        if(t == 0)

        {

            result = arr[i];

            t = 1;

        }

    }

    t = 0;

    for(i = 0; i < length; ++i)

    {

        if(arr[i] == result)

            t++;

    }

  

    return result;

}

 

int main()

{

    int a[10]={3,2,3,1,2,3,3,3,7,3};

    int* n=a;

    cout<<"水王的id号为:"<<shuiwang(a,9)<<endl;

    return 0;

}

四,实验结果

五,总结

课上自己想到的只有第一种思路,后来有同学提出第二种思路,最后 处于程序代码优化的考虑,老师为我们提供了第三种思路。通过老师和同学的帮助,最终完成了本次实验,在以后的实验中要扩宽自己的思路

 
posted @ 2015-04-21 20:56  小小金丫  阅读(125)  评论(0编辑  收藏  举报