6、腾讯面试题

给你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次....   
以此类推..   

 

*******************************************

程序(1)

#include<iostream>
using namespace std;

const int len = 10;

int main()
{
	int count;
	int i, j;

	int a[len];
	for (int k = 0; k < len; k++)
		a[k] = k;

	int count_times[len];
	//memset(count_times, 0, len);
	for (int k = 0; k < len; k++)
		count_times[k] = 0;

	bool success = false, result = true;

	while (!success)
	{
		result = true;

		// 使用循环,一步步纠正上排数组在下排出现的次数,直到最后一次,所有的下排数组元素都有:count_times[i] == count
		for (i = 0; i < len; i++)
		{ 
			count = 0;
			for (j = 0; j < len; j++)
			{    
				if (count_times[j] == i)
					count++;
			}

			if (count_times[i] != count)
			{
				count_times[i] = count;
				result = false;
			}
		}
		success = result;
	}

	for (j = 0; j < len; j++)
		cout << count_times[j] << " ";

	return 0;
}

PS:该程序时间复杂度为O(n^3)


程序(2)

#include<iostream>
using namespace std;

const int len = 10;

// 下排数字所有和肯定为10
int main()
{
	int next, count;
	int i, j;

	bool isEqual;

	int a[len];
	int count_times[len];
	//memset(count_times, 0, len);
	for (i = 0; i < len; i++)
	{
		a[i] = count_times[i] = 0;
	}

	for (i = 0; i < len; i++)
	{  
		a[0] = i;          //逐一试探a[0]位置的值,肯定位于0-9   
		next = a[0];       //下一个位置   
		count = a[0];      //当前数组所有值的和   

		while (count < len)
		{  
			a[next]++;     //跳到一下个位置,令其值+1   
			count++;       //总和加1   
			next = a[next];//确定下一个位置   
		}   

		for (j = 0; j < len; j++) 
			count_times[a[j]]++;      //核对数组中的值   

		for (j = 0; j < len; j++) 
		{
			if (a[j] == count_times[j])
				isEqual = true;
			else
			{
				isEqual = false;
				break;
			}
		}
		if (isEqual)
		{   //如果相等,证明是对的,打印 
			for (j = 0; j < len; j++) 
				cout << a[j] << " ";   
			break;   
		}   
		else
		{   //否则重置result 和a数组,继续下一轮试探。   
			for (j = 0; j < len; j++)
			{
				a[j] = count_times[j] = 0;
			}
		}          
	} 

	return 0;
}

PS:该程序时间复杂度为O(n^2)

你可能感兴趣的:(6、腾讯面试题)