一道技术面试题而已

 腾讯面试题: 给你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分钟,好吧,最近老在做应用是该好好练练算法了。

posted @ 2011-03-16 19:24  skiplow的苞米地  阅读(582)  评论(1编辑  收藏  举报