在看到题的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分钟,好吧,最近老在做应用是该好好练练算法了。