算法习题7:下排每个数都是先前上排那十个数在下排出现的次数

腾讯面试题:   
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数   
要求下排每个数都是先前上排那十个数在下排出现的次数。   
上排的十个数如下:   
【0,1,2,3,4,5,6,7,8,9】
 
初看此题,貌似很难,10分钟过去了,可能有的人,题目都还没看懂。   
 
举一个例子,   
数值: 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次....   
以此类推..   
*/

这题,炸一看,感觉是,如果先从前面开始推,是个很困难的事,于是从面开始,如果9对应次数1,那么总共10个数,剩下九个数要全为某一个数,然而这个数对应的次数要为9,这就冲突了,所以9只能对应0
0 1 2 3 4 5 6 7 8 9
0
同理
0 1 2 3 4 5 6 7 8 9
0 0 0
下面分析6,发现可以等于1 当然就是0的次数为6了
0 1 2 3 4 5 6 7 8 9
6 1 0 0 0
那么我们发现1出现了1次,但是给1标注1次时,1就是2次,所以出现
0 1 2 3 4 5 6 7 8 9
6 2 1 1 0 0 0
刚好剩下的补0就好了,这是我一开始的思路,再往下推,发现这答案貌似唯一,那么通过程序来反复推应该是可以的
下面用c++实现
他这里用两个数组实现更新
我这里方法差不多,是在一个数组上更新的

//============================================================================
// Name        : CountNumber.cpp
// Author      : YLF
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

class CountNumber{
public:
	const static int LENGTH = 10;
private:
	int arr[LENGTH];
	bool success;
public:

	CountNumber(bool bSuccess):success(bSuccess){
		initArr();
	}

	void initArr(){
		int i=0;
		for(i=0;i<LENGTH;i++){
			arr[i] = 0;
		}
	}

	bool updateArr(){
		int i = 0;
		cout<<"update..."<<endl;
		success = true;
		for(i=0;i<LENGTH;i++){
			 int count = getCount(i);
			 if(count != arr[i]){
				 arr[i] = count;
				 success = false;
			 }
		}
		return success;

	}

	int getCount(int n){
		int i = 0;
		int count = 0;
		for(i=0;i<LENGTH;i++){
			if( arr[i] == n)
				count++;
		}
		if(count>9)
			count = 9;
		return count;
	}

	int* getArr(){
		return arr;
	}
};

int main() {

	CountNumber c = new CountNumber(false);

	while(!c.updateArr())
		;
	int *arr = c.getArr();
	int i=0;
	for(i=0;i<c.LENGTH;i++)
		cout<<arr[i]<<" ";
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值