• 八十四题合集 【微软面试100题 第八十四题】


    题目要求

      1.a~z包括大小写与0~9组成的N个数,用最快的方式把其中重复的元素挑出来;

      2.已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要求你构造一个发生器,使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、2、3的概率均为1/3;...构造一个发生器,使得它构造1、2、3...n的概率均为1/n,要求复杂度最低;

    题目分析

      1.用最快的方式,即不用考虑内存问题。可以用hash表的方式存储,时间复杂度O(N).

      2.已知:P(rand()==0) = p,P(rand()==1) = 1-p;

        则构造1/2发生器可以这样:rand()两次就会得到00、01、10、11,则P(rand()rand()==01) = p(1-p),P(rand()rand()==10) = (1-p)p == P(rand()rand()==01);因此当rand()两次得到01则输出0,rand()两次10则输出1,得到11或00就忽略。

        同理构造1/3发生器可以这样:rand()三次就会得到000、001、010、011、100、101、110、111,其中001/010/100的概率相同。

        ......

    代码实现

    问题1代码:

    #include <iostream>
    
    using namespace std;
    
    void FindDupliStr(char *p);
    
    //为什么是122?因为字符z的十进制为122
    char Hash[122];
    
    int main(void)
    {
        char *str = "dfsfASDFKLJDF4234789230fd";
        FindDupliStr(str);
        return 0;
    }
    void FindDupliStr(char *p)
    {
        if(p==NULL)
            return;
        int len = strlen(p);
        for(int i = 0;i<len;i++)
        {
            if(Hash[p[i]]==0)
            {
                Hash[p[i]]=1;
            }
            else if(Hash[p[i]]==1)
            {
                Hash[p[i]] = 2;
                cout << p[i] << " ";
            }
        }
    }
  • 相关阅读:
    C++ list<list<int> >类型的对象遍历
    Apache与Nginx服务器对比
    服务器重写技术:rewrite
    冒泡排序(python版)
    有k个list列表, 各个list列表的元素是有序的,将这k个列表元素进行排序( 基于堆排序的K路归并排序)
    堆排序(C++版)
    [转载] 单链表的相关操作
    TCP三次握手连接与四次握手断开
    [转载] TCP与UDP对比
    进程与线程的联系与区别
  • 原文地址:https://www.cnblogs.com/tractorman/p/4122144.html
Copyright © 2020-2023  润新知