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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一小练——最长平台问题相关的知识,希望对你有一定的参考价值。

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


题目:最长平台问题


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

比如,在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语言名题精选百则》




以上是关于每日一小练——最长平台问题的主要内容,如果未能解决你的问题,请参考以下文章

每日一小练——因子分解

每日一小练——因子分解

每日一小练——Eratosthenes 筛选法

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

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

每日一小练——二项式系数加法解