最長平臺(plateau)
阿新 • • 發佈:2019-01-25
最長平臺
已知一個已經從小到大排序的陣列,這個陣列中的一個平臺(plateau)就是連續的一串值相同的元素,並且這一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中1,2,2,3,3,4,5,5,6都是平臺。試編寫一個程式,接受一個數組,把這個陣列中最長的平臺找出來。在上面的例子中3.3.3就是該陣列中最長的平臺
要求:
1,使用的變數越少越好
2,能否只把陣列的元素每一個都只檢查一次就得到結果?
3,程式語句越少越好
我寫的程式碼:
標準答案:#include <stdio.h> int main() { int a[10]; int i,max=0,curr=0,position=0; printf("input a array\n"); for(i=0;i<10;i++) { scanf("%d",&a[i]); } for(i=0;i<9;i++) { if((a[i+1]-a[i])==0) { curr++; if(curr>max) { max=curr; position=i+1; } } else curr=0; } max++; printf("max %d position %d\n",max,position); for(i=0;i<max;i++) { printf("%d ",a[position]); } printf("\n"); return 0; }
int longest_plateau(int x[], int n) { int length = 1; /* plateau length >= 1. */ int i; for (i = 1; i < n; i++) if (x[i] == x[i-length]) length++; return length; } /* ------------------------------------------------------ */ #include <stdio.h> void main(void) { int x[] = { 3, 4, 4, 7, 8, 9, 9, 9, 9, 10}; int n = sizeof(x)/sizeof(int); int i, longest_plateau(int [], int); printf("\nLongest Plateau Computation Program"); printf("\n==================================="); printf("\n\nThe Given Array :"); for (i = 0; i < n; i++) printf("%5d", x[i]); printf("\n\nLength of the Longest Plateau is %d", longest_plateau(x, n)); }
我寫的程式碼比標準答案多一個功能,顯示最長的平臺,而不僅僅是平臺長度。如果僅僅顯示長度,則使用的變數跟標準答案一樣多,第一條要求符合。迴圈只有一次,第二條也符合。
我的思路是這樣:判斷後一個數是否等於前面一個數,如果相等則當前長度(curr)加1,如果當前長度(curr)大於最大長度(max),則max=curr,並記下最大長度所在位置(position)。如果後一個數與前一個數不等,則curr清零。
而標準答案實在是精妙,利用lenth來記錄當前長度,並用lenth來測量後面的plate,如果遇上更大的plate則lenth++,最後返回最大lenth。
作者是知名電腦科學家David Gries,折服orz...