• 一道技术面试题而已


     腾讯面试题: 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】

        在看到题的10分钟里我上了一次厕所,骂了无数次的娘,回顾了下利比亚暴乱,看了条日本地震新闻,思索了下世界和平的问题,还和隔桌的同窗谈论了下关于346何时人多人少的随机概率分布问题。可就是没写出算法来,更悲剧的是在接下来的4个10分钟里我还是没写出来。然后果断去看了下别人写的答案。

        在看别人的答案之前,我想先来说说我的一些思路,虽然我怎么都没写通。1.接下来10个数的总和必为10,这个很好理解,所以我设想把这个条件当成成功与否的判断。2.这种题只能用穷举,而我想的是先穷举某几个最有可能的数比如0,1然后用递归推到出结果。3.我要用C++,类都设计好了

    class getnum
    {
    public:
     getnum();                                   //construct
     void tochange(int n);                   //主运算函数
      int sum();                                 //计算bom[]的所有数总和
      void show();                             //显示结果
     private:
     int bom[10];
    };

        接下来说说我失败的原因吧那就是慎用递归。递归很可怕,递归有时能很好的解决问题,但它不可能每次都是算法的最优解放。递归效率非常之差,如果函数中使用了一个for循环那这个算法的计算量将是很恐怖的,而且递归的写法也不是非常容易,我就成功的写错了好几次悲剧。

        最后奉上答案(其实我决定答案的算法不是特别好,这将循环太多次,这个人定义函数和变量的规则的习惯就不说了)

    #include <iostream.h>
    #define len 10


    class NumberTB   
    {   
    private:  
    int top[len];   
    int bottom[len];  
    bool success;
    public:
    NumberTB();
    int* getBottom();
    void setNextBottom();
      int getFrequecy(int num);
    };


    NumberTB::NumberTB()   
    {   
    success = false;   

    //format top   
    for(int i=0;i<len;i++)   
    {   
    top[i] = i; 
    } 
    }


    int* NumberTB::getBottom()
    {   
    int i = 0; 
    while(!success)   
    {   
    i++;   
    setNextBottom();   
    } 
    return bottom;   
    }   



    //set next bottom   
    void NumberTB::setNextBottom()   
    {   
    bool reB = true;   

    for(int i=0;i<len;i++)   
    {   
    int frequecy = getFrequecy(i);   

    if(bottom[i] != frequecy)   
    {   
    bottom[i] = frequecy;   
    reB = false;   
    }   
    }   
    success = reB;   
    }   


    //get frequency in bottom   
    int NumberTB::getFrequecy(int num) //此处的num即指上排的数 i
    {   
    int count = 0;   

    for(int i=0;i<len;i++)   
    {   
    if(bottom[i] == num)   
    count++;   
    }   
    return count; //cout即对应 frequecy
    }


    int main()
    {   
    NumberTB nTB;  
    int* result= nTB.getBottom();   

    for(int i=0;i<len;i++)   
    {   
    cout<<*result++<<endl;   
    }   
    return 0;
    } 

    /*
    运行结果:
    6
    2
    1
    0
    0
    0
    1
    0
    0
    0
    Press any key to continue
    */

         这是腾讯的面试题,10分钟,好吧,最近老在做应用是该好好练练算法了。

  • 相关阅读:
    hdu 5115 区间dp ***
    CF 149D Coloring Brackets 区间dp ****
    区间dp总结
    hdu 5284 BestCoder Round #48 ($) 1001 水题 *
    vijos 1038 括号+路径 ***
    vijos 1037 ***
    vijos 1028 LIS *
    使用alpine 构建 golang 运行容器
    Go Http包解析:为什么需要response.Body.Close()
    如果open的file不close , 会有什么样的影响
  • 原文地址:https://www.cnblogs.com/skiplow/p/1986369.html
Copyright © 2020-2023  润新知