免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: davycu
打印 上一主题 下一主题

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

论坛徽章:
0
81 [报告]
发表于 2010-09-21 12:47 |只看该作者
我记得有一个O(n)的方法

论坛徽章:
0
82 [报告]
发表于 2010-09-21 17:41 |只看该作者
  1. int max_sum(int *array, int array_len)
  2. {
  3.     int iTail = 0;
  4.     int iMaxBit = 0;
  5.     int iMaxArray = 0;
  6.     int iSum = 0;

  7.     if(array_len <= 0 || array == NULL)
  8.     {
  9.         return -1;
  10.     }
  11.     for(iTail = 0; iTail < array_len; iTail++)
  12.     {
  13.         if(iTail == 0)
  14.         {
  15.             iMaxBit = array[iTail];
  16.         }
  17.         else if(iMaxBit < array[iTail])
  18.         {
  19.             iMaxBit = array[iTail];
  20.         }

  21.         iSum += array[iTail];
  22.         if(iSum <= 0)
  23.         {
  24.             iSum = 0;
  25.             continue;
  26.         }
  27.         if(iSum > iMaxArray)
  28.         {
  29.             iMaxArray = iSum;
  30.         }
  31.     }
  32.     return (iMaxBit <= 0 ? iMaxBit : iMaxArray);
  33. }
复制代码

论坛徽章:
0
83 [报告]
发表于 2010-09-22 01:00 |只看该作者
貌似大部分回复都是错的

论坛徽章:
0
84 [报告]
发表于 2010-09-22 17:17 |只看该作者
本帖最后由 一生戏 于 2010-09-24 21:00 编辑

我们前天的一道考试题就是这样的,我们要求用shell实现的,考试时没做出来,考后整出来了
给你参考下思路吧
代码贴在88楼

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
85 [报告]
发表于 2010-09-22 18:02 |只看该作者

论坛徽章:
0
86 [报告]
发表于 2010-09-23 10:30 |只看该作者
万一数组里全是负数呢 ,那个编程珠玑的性能最优的那个算法好像就有问题。

maxsofar=0
maxendinghere =0
for i = [0,n)
maxendinghere =max (maxendinghere+x[i],0)
maxsofar = max(maxsofar,maxendinghere)

是不是得到的结果为0

论坛徽章:
0
87 [报告]
发表于 2010-09-23 11:25 |只看该作者
本帖最后由 freesoftsomuch 于 2010-09-23 11:29 编辑
我们前天的一道考试题就是这样的,我们要求用shell实现的,考试时没做出来,考后整出来了
给你参考下思路吧 ...
一生戏 发表于 2010-09-22 17:17



    感觉你这种算法,全为负是会溢出 max这个底参数调成负,但总有个边界,这个有没有更好的方法,可以把这个边界去掉!在 shell里实现!

论坛徽章:
0
88 [报告]
发表于 2010-09-24 20:52 |只看该作者
本帖最后由 一生戏 于 2010-09-24 20:56 编辑
感觉你这种算法,全为负是会溢出 max这个底参数调成负,但总有个边界,这个有没有更好的方法,可以 ...
freesoftsomuch 发表于 2010-09-23 11:25

今天刚上论坛就看到楼上的消息了
楼上提的问题,后来我也想到了,我用数组的第一个值来作为max的初值
  1. #!/bin/bash
  2. ary=(-9 -12 -120 -8 -20 -100 -30 -89 -20)
  3. max=${ary[0]}
  4.         for ((i=0;i<${#ary[*]};i++))
  5.         do
  6.                 sum=$(($sum+${ary[i]}))
  7.                 ary1=(${ary1[*]} ${ary[i]})
  8.                 if [ $sum -le ${ary[i]} ]
  9.                 then
  10.                         ary1=(${ary[i]})
  11.                         sum=${ary[i]}
  12.                 fi

  13.                 if [ $sum -ge $max ]
  14.                 then
  15.                         max=$sum
  16.                         ary2=(${ary1[*]})
  17.                 fi
  18.         done
  19. echo "连续最大的组合为: ("${ary2[*]}")  其和为:"$max
复制代码

论坛徽章:
0
89 [报告]
发表于 2010-09-25 12:36 |只看该作者
这些题目都考烂了。。

论坛徽章:
0
90 [报告]
发表于 2010-09-25 14:02 |只看该作者
本帖最后由 greensnow 于 2010-09-25 14:05 编辑

二楼是对的吧
不过要先遍历一边看看是否全为负数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP