免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: davycu

[算法] 迅雷笔试题 [复制链接]

论坛徽章:
0
发表于 2010-09-17 11:49 |显示全部楼层
mark 一下

论坛徽章:
0
发表于 2010-09-17 12:54 |显示全部楼层
我个人认为,正式编码前要想想符合条件的数列具有什么特征,暂时想到下面2个:
1。头和尾必然是正数--如果头/尾是负数,砍掉后剩余的数列之和会更大。
2。选定某正数为头后,逐一向后累加求和,中间若出现和为负值的情况,即可以结束,向前回溯至和最大的位置并记录--这实际上是1的推论。

其实有了1即可以用一个简单的二重循环得出答案,2只能简化内循环的判断加快速度,但是会增加编码复杂度。

论坛徽章:
0
发表于 2010-09-17 14:56 |显示全部楼层
#define N 100
int c[N] = {...};
int i = 1, count = N -1 ,max ;

while( i < count)
{
  if (max = (c[i] + c[i+1]) <  (c[i] + c[i-1]))
{
max  = (c[i] + c[i-1];
}

}
printf("max=%d\n",max);

论坛徽章:
0
发表于 2010-09-17 17:00 |显示全部楼层
回复 12# churchmice
代码,肯定有bug,比如全部负数的时候...

论坛徽章:
0
发表于 2010-09-17 17:15 |显示全部楼层
回复 62# trueyellow


    你的假设根本不成立,可能是全负数的

论坛徽章:
0
发表于 2010-09-17 21:44 |显示全部楼层

  1. iint max_sum(int *array, int array_len);
  2. {
  3.     int sum[array_len];
  4.     sum[array_len-1] = array[array_len-1];
  5.    
  6.     //找出以第i个元素开头的最大的和
  7.     for(int i = array_len-2; i >= 0; --i)
  8.     {
  9.             if(sum[i+1] > 0)
  10.             {
  11.                     sum[i] = array[i] + sum[i+1];
  12.             }
  13.             else
  14.             {
  15.                     sum[i] = array[i];
  16.             }
  17.     }
  18.    
  19.     //从这些和中找出最大的即为所求
  20.     int max = sum[0]
  21.     for(int i = 0; i < array_len; ++i)
  22.     {
  23.             max = max < sum[i] ? sum[i] : max;
  24.     }
  25.    
  26.     return max;
  27. }
复制代码

论坛徽章:
0
发表于 2010-09-18 00:53 |显示全部楼层
本帖最后由 bo_00 于 2010-09-18 01:01 编辑

下面那样也行吧,担心有欠妥的地方

  1. //#include "..."

  2. int
  3. max_sum(int *array, int array_len){

  4.         int max,total,start,end;
  5.         int i,j;
  6.        
  7.         max = array[0];//以备元素均为负值
  8.         total=start=end=0;        //init
  9.        
  10.         for(i=0;i<array_len;i++){
  11.                 //起始下标递进,计算连续元素相加时最大值的产生
  12.                 for(j=i;j<array_len;j++){
  13.                         total += array[j];
  14.                         if(total > max){
  15.                                 max = total;//保存最大值 与 出现最大值时的起始下标和结束下标。
  16.                                 start = i;
  17.                                 end = j;
  18.                         }
  19.                 }
  20.                 total = 0;//clear
  21.         }
  22.        
  23.         //打印start 到 end 的所有元素值和max值:for(n=start ;n<=(end - start);n++)
  24.         //即便max为负值,仍打印
  25.         //....
  26.        
  27. }
复制代码

论坛徽章:
0
发表于 2010-09-18 01:11 |显示全部楼层
12楼   是很好的算法,稍稍修改下全是负数的情况就行了。

论坛徽章:
0
发表于 2010-09-18 01:20 |显示全部楼层
回复 68# fldsun


    12楼的,根本就是错的。根本得不出答案。12楼的答案是从0元素开始,连续递加下一元素,可能发生的最大值是多少。

论坛徽章:
0
发表于 2010-09-18 07:52 |显示全部楼层
看到这个贴。看到这个贴的回答。我笑了。。
当然。。我是出于善意。不知为什么。就是有种很愉快的感觉。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP