最长平台
已知一个已经从小到大排序的数组,这个数组中的一个平台(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...