上得廳堂,下得廚房,寫得代碼,翻得圍牆,歡迎來到睿不可擋的每日一小練!
題目:最長平台問題
內容:一直一個已經從小到大排序的數組,這個數組中的一個平台就是連續的一串相同的元素,並且這個元素不能再延伸。
例如,在1,2,2,3,3,3,4,5,5,6中1,2,2,3,3,3,4,5,5,6都是平台.試編寫一個程序,接受一個數組,把這個數組中最長的平台找出來。在這個例子中, 3,3,3就是該數組的中的最長的平台。
ps:這個問題曾經困擾過David Gries這位知名的計算機科學家。
我的解法:上來沒多想,打開vs2013就敲了起來,問題果然很簡單,分分鐘就超神。。奧,不對就解決了!
#includeusing 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] <
實驗結果:
然後看了下答案,瞬間覺得自己應該在多考慮一下這個問題,計算機科學家的解法確實代碼少了很多。。。
#includeusing 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語言名題精選百則》