zoukankan      html  css  js  c++  java
  • 寻找发帖水王01

    设计思想:

      每次从ID列表中删除两个不同的ID,不影响“水王的ID在剩余ID中仍然超过一半”这一事实,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID。不断重复这个过程,时间复杂度为O(n)。

    具体实现:

      具体编程的时候,使用一个candidate记录当前猜测的水王ID,一个count记录其累计次数,然后遍历整个ID列表,对于当前所考查的ID,如果和candidate相同,那么count++,如果不同,那么count--,这个“count--;”的动作就是“删除两个不同的ID”在程序中的体现,当count==0时,则更新candidate。这样呢,每次count--都相当于删除了两个不同的ID(可能包含水王的,也可能不包含),而每考察一个ID,要么会做count--的动作,要么会做count++的动作,两者必居其一,而由于“水王ID超过一半”这一事实,因此count--的次数一定比count++少,因此最后count一定是个正整数,且此时的candidate一定记录着水王的ID。

    源程序代码:

    //寻找发帖水王01
    //胡浩特 2016年5月16日
    
    #include<iostream>
    using namespace std;
    
    int find(int ID[], int n)
    {
        int nTimes = 0, i, candidate;//candidate记录当前猜测的水王ID
    
        for (i = 0; i < n; i++)
        {
            if (nTimes == 0)
            {
                candidate = ID[i];
                nTimes = 1;
            }
            else
            {
                if (candidate == ID[i])
                {
                    nTimes++;
                }
                else
                {
                    nTimes--;
                }
            }
        }
        return candidate;
    }
    
    int main()
    {
        int arr[] = { 1, 2, 3, 4, 2, 5, 2, 2, 3, 2, 5, 2 };
        cout << "“水王”的ID是:" << find(arr, 12) << endl;
        return 0;
    }

     遍历一遍取值如下:

    运行结果:

     

      

  • 相关阅读:
    postgresql字符串函数
    ruby中的设计模式--策略模式
    (转)MySQL 性能优化的最佳20多条经验分享
    (转)ruby中的设计模式--模板方法
    观察者模式的应用
    postgresql的ARRAY_TO_STRING
    ruby和javascript的观察者模式
    mysql表连接的时候注意事项
    checkbox记忆功能的实现
    order by的注意事项
  • 原文地址:https://www.cnblogs.com/JYQ-hu/p/5499314.html
Copyright © 2011-2022 走看看