您的位置:首页 > 职场人生

一道技术面试题而已

2011-03-16 19:24 183 查看
腾讯面试题: 给你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分钟,好吧,最近老在做应用是该好好练练算法了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: