首页 > 编程语言 > 详细

C语言强化(六)使下排数是上排数在下排出现的次数

时间:2015-04-25 10:46:54      阅读:311      评论:0      收藏:0      [点我收藏+]

有时候,编程仅仅是为了代替人力劳动。


通过这道题,你可以掌握

  • 编写愚蠢的算法虐待自己的电脑


题目

给你 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


给了十分钟让人解答。

首先,理解题意花掉了大概三分钟。

剩下七分钟,胡思乱想,设十个变量,列十个方程求解?

似乎发现到规律,下面十个数相加等于10!

and then ...???

十分钟过去了,不死心,继续想。。。


其实有时候,算法并没有那么高深莫测,算法仅仅是人脑的反映,将算法变成计算机能识别的语言,让计算机帮忙运算,这才是编程的初衷。


思路

不断地循环遍历下排数字,使之满足是上排那十个数在下排出现的次数,直到有一次遍历,
是所有下排的数都满足这个要求,这时就找到题目所要求的十个数


呵呵,很愚蠢很繁琐的算法,但事实就是这样。


源代码

#include <stdio.h>
#include<stdlib.h>
#include <iostream>


using namespace std;

/**
给你 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 

思路
不断地循环遍历下排数字,使之满足是上排那十个数在下排出现的次数,直到有一次遍历,
是所有下排的数都满足这个要求,这时就找到题目所要求的十个数
*/
#define len 10

class NumberTB
{
public:
	int top[len];
	int bottom[len];
	bool success;
	NumberTB();
	int* getBottom();
	void setNextBottom();
	int getFrequecy(int num);
};

void printArray(int arr[len]){
	for(int i =0;i<len;i++){
		cout<<arr[i]<<endl;
	}
}

//初始化上排数
NumberTB::NumberTB()
{
	success = false;
	//format top
	for(int i=0;i<len;i++)
	{
		top[i] = i;
	}
}

//获得下排数
int* NumberTB::getBottom()
{
	int count = 0;//计数器
	while(!success)
	{
		count++;
		setNextBottom();

		//这里需要一个判断,判断是否这个数组不可能做到
		//下排每个数都是先前上排那十个数在下排出现的次数
		/**
		{
			
		}
		*/
	}
	return bottom;
}

//设置下排数,使其等于上排数在下排的次数
void NumberTB::setNextBottom()
{
	bool reB = true;
	for(int i=0;i<len;i++)
	{
		int frequecy = getFrequecy(top[i]);//获得上排数在下排的次数
		if(bottom[i] != frequecy)
		//遍历过程中,只要有一次下排数bottom[i]不等于上排数在下排的次数frequecy
		//则reB = false;getBottom会再循环一次,执行setNextBottom
		//直到所有数都满足,才能跳出循环
		{
			bottom[i] = frequecy;
			reB = false;
		}
	}
	success = reB;
}

/**统计上排的数在下排出现的次数
num		上排的数
*/
int NumberTB::getFrequecy(int num) //此处的 num 即指上排的数 i
{
	int count = 0;
	for(int i=0;i<len;i++)
	{
		if(bottom[i] == num)
		count++;
	}
	return count; //cout 即对应 frequecy
}

void main()
{
	NumberTB nTB;
	int* result= nTB.getBottom();
	for(int i=0;i<len;i++)
	{
		cout<<*result++<<endl;
	}
	//printArray(nTB.bottom);	
	system("pause");
}


运行图
技术分享


有时候,算法就是这么“愚蠢”,不要想太多。

ps:此题为腾讯面试题。

C语言强化(六)使下排数是上排数在下排出现的次数

原文:http://blog.csdn.net/hzy38324/article/details/45267805

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!