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

来源:互联网 发布:恶搞淘宝收件人名字 编辑:程序博客网 时间:2024/06/06 08:29
腾讯面试题:
给你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 10int 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();}  



0 0
原创粉丝点击