您的位置:首页 > 其它

给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数

2014-02-15 22:55 309 查看
腾讯面试题:

给你10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数

要求下排每个数都是先前上排那十个数在下排出现的次数。

上排的十个数如下:

【0,1,2,3,4,5,6,7,8,9】

举一个例子,

数值: 0,1,2,3,4,5,6,7,8,9

分配: 6,2,1,0,0,0,1,0,0,0

0 在下排出现了6 次,1 在下排出现了2 次,

2 在下排出现了1 次,3 在下排出现了0 次....

以此类推..

刚看到这道题,感觉第二排安排数字位置的影响因素颇多,无从下手,比如,如果下一排全是0,则0位置就不能为0,应该为10,因为有10个0,0变成了10,那么就剩下9个0了,所以0位置是9,9出现了,那9位置须为1,0的次数就变为了8,那9就没了,。。。。。。啊啊好烦

解题过程:

1、上一排的位置数组为pre={0,1,2,3,4,5,6,7,8,9},下一排数组nxt先赋值为0

2、遍历pre数组,pre[0]=0,从nxt数组中找出0出现的次数10,因为nxt[0]为0而不为10,所以此位置不对,先将10==nxt[0],

pre[1]=1,从nxt数组中找出1出现的次数0,因为nxt[1]为0等于0,所以此位置不动,继续。。。。。

遍历玩pre数组后,nxt={10,0,0,0,0,0,0,0,0,0}

3、循环2,知道所有位置的元素都一一对应结束,详细过程如下:

(1)从nxt找出0出现的次数为9,因nxt[0]=10,所以nxt[0]=9,nxt[9]=1,此时nxt={9,0,0,0,0,0,0,0,1}

(2)找出0出现的次数8,变动的数组为nxt[0]=8,nxt[1]=1,nxt[8]=1,因为nxt[9]=1不为0,所以nxt[9]=0,此时nxt={8,1,0,0,0,0,0,0,1,0}

(3)变动的数组为nxt[0]=7,nxt[1]=2,nxt[2]=1,nxt[7]=1,nxt[8]=0nxt={7,2,1,0,0,0,0,1,0,0}

(4)变动的数组为nxt[0]=6,nxt[6]=1,nxt[7]=0,nxt={6,2,1,0,0,0,1,0,0,0}

(5)检测到所有元素位置已就绪,退出循环

#include "iostream"
#include <algorithm>
#include <functional>
using namespace std;

#define LEN 10
int pre[LEN]={0,1,2,3,4,5,6,7,8,9};//上一排的数
int nxt[LEN]={0};//下一排的数

//某数在下一排出现的次数
int  getCount(int k)
{
int cnt=0;
for(int i=0;i<LEN;i++)
if (nxt[i]==k)cnt++;
return cnt;
}

//根据上一排的情况生成下一排
void run(){
bool found=false;//标记是否找到解
while(!found){
found=true;
for(int i=0;i<LEN;++i){
int cnt=getCount(pre[i]);
if(nxt[i]!=cnt){
nxt[i]=cnt;
found=false;
}
}

for(int i=0;i<LEN;i++){
cout<<nxt[i]<<" ";
}
cout<<endl;
}
}
void main()
{
run();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: