zoukankan      html  css  js  c++  java
  • C++求解数组中出现超1/4的三个数字。

    #include <iostream>
    using namespace std;
    //求x!中k因数的个数。
    int Grial(int x,int k)
    {
        int Ret = 0;
        while (x)
        {
            Ret += x / k;
            x /= k;
        }
        return Ret;
    }
    int main()
    {
        cout << Grial(10, 2) << endl;
        return 0;
    }
    
    //假设要求一个n!中k的因子个数,那么必然满足例如以下的规则。
    //即x=n/k+n/k^2+n/k^3...(直到n/k^x小于0);
    #include <iostream>
    using namespace std;
    int Grial(int x, int k)
    {
        int count = 0;
        int n = x;
        while (n)
        {
            n &= (n - 1);
            count++;
        }
        return x - count;
    }
    int main()
    {
        cout << Grial(3, 2) << endl;
        return 0;
    }
    
    
    //找出数组中出现次数超过数组一半的数字。
    #include <iostream>
    using namespace std;
    int Grial(int a[], int n)
    {
        int count=0;
        int key;
        for (int i = 0; i < n; i++)
        {
            if (count == 0)
            {
                key = a[i];
                count = 1;
            }
            else
            {
                if (key == a[i])
                {
                    count++;
                }
                else
                {
                    count--;
                }
            }
        }
        return key;
    }
    int main()
    {
        int a[] = {1,2,3,4,5,6,3,3,3,3,3};
        cout<<Grial(a, sizeof(a) / sizeof(int))<<endl;
        return 0;
    }
    
    #include <iostream>
    //上一题的扩展,有3个数字出现次数超过1/4。
    using namespace std;
    void Grial(int a[], int n)
    {
        if (n <= 3)return;
        int count1=0, key1=0;
        int count2=0, key2=0;
        int count3=0, key3=0;
        for (int i = 0; i < n; i++)
        {
            if (!count1 && key2 != a[i] && key3 != a[i])
            {
                count1++;
                key1 = a[i];
            }
            else if (key1 == a[i])
            {
                count1++;
            }
            else  if (key2!=a[i] && key3!=a[i])
            {
                count1--;
            }
    
    
            if (!count2 &&key3 != a[i] && key1!=a[i])
            {
                count2++;
                key2 = a[i];
            }
            else if (key2 == a[i])
            {
                count2++;
            }
            else if (key1!=a[i] && key3!=a[i])
            {
                count2--;
            }
    
    
            if (!count3 && key1!=a[i] && key2!=a[i])
            {
                count3++;
                key3 = a[i];
            }
            else if (key3 == a[i])
            {
                count3++;
            }
            else if (key1!=a[i] && key2!=a[i])
            {
                count3--;
            }
    
    
        }
        cout << key1 << endl;
        cout << key2 << endl;
        cout << key3 << endl;
    }
    int main()
    {
        int a[] = {1,5,5,5,5,2,3,1,2,2,1,1,1,2};
        Grial(a, sizeof(a) / sizeof(int));
        return 0;
    }
    
  • 相关阅读:
    自动批改android模拟器的imei的小程序 和 下载各个版本SDK Tools及ADT
    Bulestacks模拟器Bulestacks.prop文件里中英文对照表
    HTTP Analyzer——WEB调试代理
    XCODE 添加不同IOS版本的模拟器
    在PC上运行安卓(Android)应用程序的几个方法
    二叉查找树的类模板实现
    以给定值为基分割链表
    简单二叉排序树的实现
    vector和list删除元素
    二叉树的基本操作
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7146515.html
Copyright © 2011-2022 走看看