1. 程式人生 > >最長平臺(plateau)

最長平臺(plateau)

最長平臺

已知一個已經從小到大排序的陣列,這個陣列中的一個平臺(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...