[讨论]C语言名题系列:最长平台

0

朋友Kada(进入博客)最新的一篇关于C语言的题目引起了我的兴趣,所以我也尝试编写了代码,在这里分享。

题目是这样的:

最长平台问题:已知一个已经从小到大排序的数组,这个数组中的的一个平台(Plateau)就是连续的一串值相同的元素,并且这个串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中1,2-2,3-3-3,4,5-5,6都是平台,试编写一个函数,接收一个数组,并把这个数组中的最长平台所含的个数作为返回值,如上例中3-3-3就是最长平台,该平台中一共有3个3,故函数返回值为3。要求使用最少的变量,最少的查询次数以及最少的程序语句!

Kada写的代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define max(x, y) ( (x) > (y) ) ? (x) : (y)
int kz_plateau(int x[], int n)
{
    int length = 1, maxlen = 1;
    int i;
    for(i=1; i<n; i++)
    {
        if(x[i] == x[i-length])
            length++;
        else
        {
            maxlen = max(maxlen, length);
            length = 1;
        }
    }
    return maxlen;
}

而我却弄不清[i-length]的意思,于是写了一个自己理解的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int p(int a[], int n)
{
    int len=1; int maxlen=1;
    for(int i=0; i<n; i++)
    {
       if(a[i]==a[i+1])
       {
          len++;
          if(len > maxlen) maxlen=len;
       }
            else len=1;
}
    return maxlen;
}

可能是我教材看多了,思维模式也是书上习题的模式。希望Kada来解释一下“if(x[i] == x[i-length])”这句代码,为什么要减呢?从数组[0]元素,往后比较,应该是数组[i++]的关系啊。由于在Kada的博客无法贴全代码,所以只好写在这里讨论了。最后感谢Kada提供经典题目。

— cloudxiao 2010,1,14

No Comments

Leave A Reply