每日一小练——最长平台问题

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练!

题目:最长平台问题

内容:一直一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串同样的元素。而且这个元素不能再延伸。

比如,在1,2,2,3,3,3,4,5,5,6中1,2,2,3,3,3,4,5,5,6都是平台.试编写一个程序,接受一个数组,把这个数组中最长的平台找出来。在这个样例中, 3,3,3就是该数组的中的最长的平台

说明:

这个程序十分简单,可是编写好却不easy,因此在编敲代码时应注意考虑以下几点:

1.使用变量越少越好

2.是否能仅仅把数组的元素每个都仅仅查一次就得到结果。

3.程序语句越少越好

ps:这个问题以前困扰过David Gries这位知名的计算机科学家。

我的解法:上来没多想。打开vs2013就敲了起来,问题果然非常easy,分分钟就超神。

。奥,不正确就攻克了!

#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int index = 0;             //数组下标索引
	int indexEnd = 0;          //目标索引
	int count = 0;             //计数器
	int tempCount = 0;         //暂时计数器
	int arrayNum[100] = { 0 }; //零不算输入元素,所以结尾判零就可以
	cout << "请输入一个数字序列,数字间以空格隔开,用0表示输入结束:" << endl;
	while((cin >> arrayNum[index])&&arrayNum[index]!=0)
		++index;
	index = 0;
	while (arrayNum[index] != 0)
	{
		//cout << arrayNum[index] << endl;
		if (arrayNum[index + 1] != 0)
		{
			if (arrayNum[index] == arrayNum[index + 1])
			{
				tempCount++;
			}
			else
			{
				if (tempCount > count)
				{
					count = tempCount;
					indexEnd = index;
				}
				tempCount = 0;
			}
		}
		++index;
	}
	cout << "输入数字序列为:" << endl;
	index = 0;
	while (arrayNum[index] != 0)
	{
		cout << arrayNum[index];
		++index;
	}
	cout << endl;
	cout << "最大的平台是:" << endl;
	cout << arrayNum[indexEnd] <<endl;
	cout << "连续次数为:" << endl;
	cout << count + 1 << endl;
	getchar();
	getchar();
	return 0;
}

实验结果:

然后看了下答案,瞬间认为自己应该在多考虑一下这个问题,计算机科学家的解法确实代码少了非常多。。

#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int index = 0;             //数组下标索引
	//int indexEnd = 0;          //目标索引
	int length = 1;            //平台长度
	int arrayNum[100] = { 0 }; //零不算输入元素。所以结尾判零就可以
	cout << "请输入一个数字序列,数字间以空格隔开,用0表示输入结束:" << endl;
	while((cin >> arrayNum[index])&&arrayNum[index]!=0)
		++index;
	index = 0;
	for (index = 1; arrayNum[index] != 0;index++)
	{
		if (arrayNum[index] == arrayNum[index - length])
			length++;
	}
	cout << "输入数字序列为:" << endl;
	index = 0;
	while (arrayNum[index] != 0)
	{
		cout << arrayNum[index];
		++index;
	}
	cout << endl;
	cout << "连续次数为:" << endl;
	cout << length << endl;
	getchar();
	getchar();
	return 0;
}

实验结果:

为了是能更好的对照我和科学家的差距,我把程序的核心代码对照一下

//科学家的
for (index = 1; arrayNum[index] != 0;index++)
{
	if (arrayNum[index] == arrayNum[index - length])
		length++;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//我的
while (arrayNum[index] != 0)
{
	if (arrayNum[index + 1] != 0)
	{
		if (arrayNum[index] == arrayNum[index + 1])
		{
			tempCount++;
		}
		else
		{
			if (tempCount > count)
			{
				count = tempCount;
				indexEnd = index;
			}
			tempCount = 0;
		}
	}
	++index;
}

由于数组顺序已经排好了所以科学家用一个变量直接探測平台最远点的想法确实精妙。

嘿嘿。慢慢学习哈~加油!

 -End-

參考文献:《c语言名题精选百则》

时间: 2024-10-25 20:48:32

每日一小练——最长平台问题的相关文章

每日一小练——列出全部子集

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:列出全部子集 内容:写一个程序,列出{1,2,3,4,...,n}这个集合的全部子集,包含空集{ }. 解决问题的算法应该有非常多种,只是我发现了一种非常easy也非常好玩的方法,就是用二进制表示几何元素的方法 比方假设n是3,则子集有(不包含空集){1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}就是1*{0,1}and2*{0,1}and3{0,1}每一个组合出现一次,所以也能够看成是{0,0,1}{0

每日一小练——按字典顺序列出所有排列

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出所有排列 内容:请写一个程序,用字典顺序列出n个元素的所有排列 这个问题有点小复杂,不是太好想,反正我是想了好久. 看到这个题目我先是想到的就是递归因为这个题目就是用指针对高位选择,然后将指针传给临近的低位再选择. 不过仔细研究原来没这么简单.以n=4举例当处理以1开头的排列时1234到1432,但是在排列2开头的时候不太好建立统一的递归关系.(没办法太统一的递归方法中将后面的数字选出来),所以将第一位分

每日一小练——快速Fibonacci数算法

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:快速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有如下规律: 尝试寻找快速的求出fn的方法 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了! 其实题目中就给出了这个算法的递归形式,所以首先我想到的是递归解法,不过因为求解快速方法在递归之前,我编写了一个非递归的算法 #include <iostream> usi

每日一小练——按字典顺序列出全部子集

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出全部子集 内容: 请写一个程序用字典顺序把一个{1,2,3,4,...,n}集合的全部子集找出来. 解答: 想必我就不用解释什么是字典顺序了,作为乘虚猿和攻城狮大家应该懂得,无论你懂不懂,反正我懂了! 事实上我们能够先列出一个实例,观察规律: 比如n=3 {1} {1,2} {1,2,3} {1,3} {2} {2,3} {3} 能够看出这种规律(假设你说我怎么没看出来,事实上你能够再多看一会!) 令一个

每日一小练——求质数

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:求质数 内容: 试编写一个程序,找出前N个质数.如果没有进一步要求,这不是难题.但在此希望从所知的.使用除法的方法中,用最快的办法来编写程序. 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了!这个题目确实很简单,先看看常规解法吧! #include <iostream> #include <math.h> #define endNum 200 using

每日一小练——等值首尾和

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:等值首尾和 内容: 假设有一个数组x[],它有n个元素,每一个都大于零:称x[0]+x[1]+...+x[i]为前置和,而x[j]+x[j+1]+...+x[n-1]为后置和.试编写一个程序,求出x[]中有多少组相同的前置和后置和. 例如:x[]的元素是3,6,2,1,4,5,2,于是x[]的前置和有以下7个,即3,9,11,12,16,21,23:后置和则2,7,11,12,14,20,23; 于是11,12,23,

每日一小练——数值自乘非递归解

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:数值自乘非递归解 内容: 连续求m^n问题(m与n是正整数).前面的提示会得到一个递归程序,请编写一个运算效率同样高的非递归的程序. 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了!如果是非递归其实一种简单的方法就是把, 递归的几种分类做好if分支,用一个循环处理就好了,不过如果我们认真思考m^n这个式子,我们会发现n如果用二进制表示的话如:2^7可改写为 2^011

每日一小练——Eratosthenes 筛选法

上得厅堂.下得厨房.写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:Eratosthenes筛选法 内容: 求质数是一个非常普遍的问题,通常不外乎用数去除.除到不尽时,给定的数就是质数. 可是早在2000年前人们就知道了一个不必用除法而找出2~N的全部质数的方法.如果一个非常奇妙的筛子,能够给出一个数.比如i,这个筛子有办法把i全部的倍数去掉. 请用这种方法求出2~N之间的全部质数.即Eratosthenes筛选法. 我的解法:上来没多想.打开vs2013就敲了起来.问题果然非常eas

每日一小练——高速Fibonacci数算法

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: 尝试寻找高速的求出fn的方法 我的解法:上来没多想,打开vs2013就敲了起来,问题果然非常easy,分分钟就超神..奥,不正确就攻克了! 事实上题目中就给出了这个算法的递归形式,所以首先我想到的是递归解法,只是由于求解高速方法在递归之前,我编写了一个非递归的算法 #include <iostrea