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

腾讯面试题:
给你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();
}  



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值