[讨论]C语言名题系列:最长平台
14
Jan
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提供经典题目。
Filed Under: 职业生涯
No Comments