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