面试C语言中 最大平台的问题

stecdeng 2006-11-06 12:35:19
/* ------------------------------------------------------ */
/* FUNCTION longest_plateau : */
/* Given a sorted (increasing) array, this function */
/* computes the length of the longest plateau. A plateau */
/* is a consective segment of an array with equal elements*/
/* For example, if x[] contains 1, 2, 3, 3, 4, 4, 5, 5, 5 */
/* and 6, then we have six plateaus, namely 1, 2, 3-3, 4-4*/
/* 5-5-5 and 6. Therefore the length of the longest one */
/* is 3. */
/* This is the simplest program which I have ever seen.*/
/* */
/* Copyright Ching-Kuang Shene June/30/1989 */
/* ------------------------------------------------------ */



已经知道一个已经从小到大排序的数组,这个数组中一个平台PLATEAU就是连续的一串数值相同的元素,并且元素不能在延伸。例如,1,2,2,3,3,3,4,5,5,6中2.2 ,3.3.3,4,5.5,6都是平台 。
编写程序 接受一个数组,把这个数组中最长的平台找出来。 例如上面的3.3.3就是最长平台。

1)尽量简洁,指出最长平台的长度即可。
2)改进1)程序,并列出最长平台的位置(最长平台可能不止一个)。
3)另写一个使用递归的程序
...全文
424 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mlwu3 2006-12-27
  • 打赏
  • 举报
回复
mark
stecdeng 2006-11-06
  • 打赏
  • 举报
回复
不是我的思路 其实是以前看的一个资料
但是我看的那个资料 如果有两组长度最长的数组 我就不知道如何显示出来
递归也是扩展下思维
pcboyxhy 2006-11-06
  • 打赏
  • 举报
回复
递归的也好办

两个思路

1
len(p,q) --- 数组从下标 p到q 之间的数的最大平台值
len(p,q) = max{p到f的长度(f是跟p相等的最后一个元素), len(f+1, q) }

2
将数组二分
len(p,q)=max{ len(p,f), len(f+1, q) } 下标为 f跟f+1 的元素不等
这个定位可以从中间的那个元素往一边延伸

不过这里递归没有什么好处


milkycat0403 2006-11-06
  • 打赏
  • 举报
回复
stecdeng() 的思路比较好啊,呵呵,其他的没有具体看。
gaopl_8278 2006-11-06
  • 打赏
  • 举报
回复
我只写实现方法:(假设给定的平台数组为szPlat,并且数组最后一个元素是以'\0'结尾的)
int oldCount=newCount=i=0;
while(szPlat[i])
{
for(;szPlat[i-1]==szPlat[i];i++)
{
newCount++;
}
if(newCount>oldCount)
{
oldCount=newCount;
newCount=0;
}
}
printf("%d",oldCount);
结果就在oldCount中,这就是你所要的最大平台,如果其中有相等的平台也没错,因为只要求最大平台的数,而不要求具体是哪个平台.









stecdeng 2006-11-06
  • 打赏
  • 举报
回复
谢谢
我记得原来有这样的写法
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;
}


主要是递归没什么头绪
pcboyxhy 2006-11-06
  • 打赏
  • 举报
回复
int plateau(int x[], int n)
{
int max=0, s=0, e=0;
for(max=1; e<n; e++){
if(x[e]==x[s] && e-s>=max) max++;
if(x[e]!=x[s]) s=e;
}
return max;
}

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧