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

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

通过这道题,你可以掌握

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

题目

给你 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:此题为腾讯面试题。

时间: 2024-10-05 16:58:20

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

C语言强化(五)输出一串数中最小的 k 个

有时候题目看似很简单,似乎非常容易实现,但是,你考虑过效率了吗? 通过这道题,你可以掌握 简单的插入排序 算法最优化的技巧 题目:输入 n 个整数,输出其中最小的 k 个. 例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4. 看到此题,第一反应就是对这串数字进行排序,然后遍历角标0~3的数字打印出来,很简单嘛~~ 怎么可以这么简单,仔细一看,题目只是要求最小的N个数字啊,这样子对整个数组进行排序有必要吗? 只需要4个最小的,也就意味着只要一

嵌入式linux C++语言(六)——运算符重载

嵌入式linux C++语言(六)--运算符重载 运算符重载的本质是函数重载. 一.重载基础 1.运算符重载的语法 返值类型 operator 运算符名称(形参表列){    重载实体;} 2.友元重载 可以将运算符重载函数声明位友元函数 #include <iostream> using namespace std; class Complex { public:     Complex(float x=0, float y=0)         :_x(x),_y(y){}     voi

C语言强化(二)设计可以求最小元素的栈

上一篇详解了二叉树转双向链表,此篇作为[C语言强化]系列第二篇,来聊聊有关栈的一道题, 通过这道题,你可以掌握 如何使用栈"先进后出"的特性 如何巧妙地借助辅助栈 如何在结构体中定义可共享的静态成员变量 题目 看似很简单的求最小值函数,思路有很多很多.笔者首先想到每次push入栈都进行一次排序,使这个栈的栈顶永远是最小元素,然后就发现这是一个很蠢很蠢的想法,第一这样做会改变了栈的结构,第二不满足题目对时间复杂度的要求. 愚蠢归愚蠢,还是有点用的.既然不能改变原来栈的结构,那为何不弄俩栈

C语言强化(十一)二叉树镜像变化 | 要求:不使用递归

用了这么久的递归,现在不让用递归了,你行么? 通过这道题,你可以学会 如何镜像变化一棵二叉树 什么是递归的本质 如何巧妙地使用辅助栈 题目: 输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点. 要求: 不使用递归 例如输入: 输出: 将二叉树镜像变化的方法很简单,只要把所有节点的左右节点对调就行了,使用递归可以非常容易的实现. 如下为递归方法实现镜像变化的函数 /** 二叉树镜像变化--递归方法实现 */ void Revertsetree_R

C语言强化(一)二叉排序树转成排序的双向链表

几乎每一位码士的编程起点都是C,在玩过了Java.C#.PHP.Python之后,重回C语言,又是什么样的一种感觉呢? 此篇博文作为 [C语言强化]系列文章的第一篇,来聊聊曾让许多码士抓耳挠腮的二叉树. 通过这道题,你可以掌握 如何创建二叉树 如何遍历二叉树 如何创建二叉链表 怎样使用递归算法 这是一道非常老土但又十分经典的数据结构题,或许很多人会说自己之前已经做过了,但又有多少人回过头来做的时候,可以不借助任何参考资料把解题思路写出来? 题目要求:二叉排序树->双向链表排序 不能新增结点,只能

rwkj 1332 C语言实验四(函数):题目1、数字根

C语言实验四(函数):题目1.数字根 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:305            测试通过:185 描述 正整数的数字根是将数位上的数字求和进行计算而来.如果各位数字之和为一位的整数,那么这个整数就是这个数的数字根:如果之后为多位数,那么重复运用此规则进行计算直至求出一个一位数.例如12,那么它的数字根就为1+2=3:例如39那么它的数字根就为3+9=12,1+2=3,最终为3. 输入 每行输入

嵌入式Linux C语言(六)——内存字节对齐

嵌入式Linux C语言(六)--内存字节对齐 一.内存字节对齐简介 1.内存字节对齐 计算机中内存空间都是按照字节划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但是在程序实际编译过程中,编译器会对数据类型在编译过程中进行优化对齐,编译器会将各种类型数据按照一定的规则在空间上排列,而不是顺序的排放,这就是内存字节对齐. 2.内存字节对齐原因 不同硬件平台对存储空间的处理是不同的.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如某些架构的CPU在访问一个没有进行对齐的变量

C语言强化(九)翻转句子中单词的顺序

这是到很常见的题目,非常简单,但你用到数据结构了吗,或者说你用对了吗? 通过这道题,你可以掌握: 如何将用户的输入,输出到控制台 如何分割字符串 如何正确使用数据结构 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空格符隔开.标点符号和普通字母一样处理. 例如输入"I am a student.",则输出"student. a am I". 思路 一.获取字符串 首先要能够获取到用户输入的一串字符串,有两点需要注意: 1.如果使

c语言:实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定, 输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表. 程序: #include<stdio.h> void mul(int n)//multiplication 乘法 { int i, j; for (i = 1; i <= n; i++) { for (j = 1; j <= i; j++) { printf("%d*%d=%-2d  ", i, j, i*j); //其中%2d中的2表示