程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 每日一小練——最長平台問題

每日一小練——最長平台問題

編輯:C++入門知識

上得廳堂,下得廚房,寫得代碼,翻得圍牆,歡迎來到睿不可擋的每日一小練!


題目:最長平台問題


內容:一直一個已經從小到大排序的數組,這個數組中的一個平台就是連續的一串相同的元素,並且這個元素不能再延伸。

例如,在1,2,2,3,3,3,4,5,5,6中1,2,2,3,3,3,4,5,5,6都是平台.試編寫一個程序,接受一個數組,把這個數組中最長的平台找出來。在這個例子中, 3,3,3就是該數組的中的最長的平台


說明:
這個程序十分簡單,但是編寫好卻不容易,因此在編寫程序時應注意考慮下面幾點:
1.使用變量越少越好
2.能否只把數組的元素每一個都只查一次就得到結果。
3.程序語句越少越好

ps:這個問題曾經困擾過David Gries這位知名的計算機科學家。


我的解法:上來沒多想,打開vs2013就敲了起來,問題果然很簡單,分分鐘就超神。。奧,不對就解決了!

#include 
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] <
實驗結果:

\


然後看了下答案,瞬間覺得自己應該在多考慮一下這個問題,計算機科學家的解法確實代碼少了很多。。。

#include 
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語言名題精選百則》




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved