免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
71 [报告]
发表于 2010-09-18 11:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
72 [报告]
发表于 2010-09-18 14:22 |只看该作者
有个初步的想法,还没有细想:

如果数组全是正数,那么整个数组和就是最大的。因此:
1. 先遍历一遍数组,记录所有负数的位置和值。
2. 计算每对负数之间所有正数的和。
3. 再将1,2步得到的值做一些比较,处理。得到结果。

不知道上面思路的正确性和时空复杂度怎么样。

论坛徽章:
0
73 [报告]
发表于 2010-09-18 17:34 |只看该作者
本帖最后由 freesoftsomuch 于 2010-09-18 18:08 编辑

int max_sum(int *array,int array_len)
{
int temp[0];
int max,start,fin;
maxmun=0;
int i ,j;
for (i = 1 ,i<array_len,i++)
    {
    if (max<max+array)
       {fin=i;
        max=max+array;
        }
       for (j=0,j<i,j++)
           {
           if (max<max-array[j])
              {
               start=j;
               max=max-array[j];
               }
              }
      }
      max=0;
      j=0;
      for(i=start,i<=fin,i++)
      {
      temp[j]=array;
      max=array++;
      j++;
     }
     return max,temp[j];   /*这个地方有问题但不知道怎么用更好的方法实现)*如果只能有选择的话我想返回temp[j]*/
}
有些语法都忘记了,纯凑热闹,不知道行不行?{:3_189:}哪个帮我测试一下。~~

论坛徽章:
0
74 [报告]
发表于 2010-09-18 20:03 |只看该作者
今天晚上我炒了两个菜,吃第一个我震撼了:世界上还有比这更难吃的菜吗?吃第二个我哭了:还真有啊!

论坛徽章:
0
75 [报告]
发表于 2010-09-19 15:22 |只看该作者
本帖最后由 lqglqy 于 2010-09-19 17:27 编辑

这样可以!还有更好的没啊?!!!!!求教~~~~~~
  1. #include    <stdlib.h>
  2. #include    <stdio.h>
  3. int max_array(int *p_a, int len)
  4. {
  5.     int max = 0;
  6.     int i,count=0;
  7.     int start = 0;
  8.     int end = 0;
  9.     for (i=0; i<len; i++) {
  10.         count += p_a[i];
  11.         if (count < 0) {
  12.             count = 0;
  13.             start = i+1;            
  14.         }   
  15.         if (count > max) {
  16.              max = count;
  17.              end = i+1;
  18.         }   
  19.     }   

  20.     printf("{");
  21.     for (;start<end;start++) {
  22.         printf("%d",p_a[start]);
  23.         if (start+1 < end)
  24.             printf(",");
  25.     }   
  26.     printf("}");
  27.     return max;

  28. }
  29. /*
  30. * ===  FUNCTION  ======================================================================
  31. *         Name:  main
  32. *  Description:  
  33. * =====================================================================================
  34. */
  35.     int
  36. main ( int argc, char *argv[] )
  37. {
  38.     int a[] = {9, -12, 120, 8, -20, 100, 30, -89, 20};
  39.     int max = max_array(a, sizeof(a)/sizeof(a[0]));
  40.     printf("=sum[%d]\n",max);
  41.     return EXIT_SUCCESS;

  42. }               /* ----------  end of function main  ---------- */
复制代码

论坛徽章:
0
76 [报告]
发表于 2010-09-19 21:27 |只看该作者
感觉C很麻烦,用PERL暴力一下,几行就搞定了:
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my @data = (9, -12, 120, 8, -20, 100, 30, -89, 20);
  5. my $max;
  6. foreach (@data) { $max += $_ if ($_ < 0); }
  7. foreach my $n (0..$#data) {
  8.         my $y;
  9.         foreach my $x ($n..$#data) {
  10.                 $y += $data[$x];
  11.                  $max = $y if ($y > $max);
  12.          }
  13. }
  14. print "$max\7";
复制代码

论坛徽章:
0
77 [报告]
发表于 2010-09-19 23:05 |只看该作者
第一步:先整理数组,将相邻的同为负的相加合并成一个数,将相邻的同为正的相加合并成一个数,其结果是正负相间的一个数组。
第二步:暴力法

论坛徽章:
0
78 [报告]
发表于 2010-09-19 23:07 |只看该作者
把连续得正数和负数合并
再把负数两边得正数都大于该负数得数合并
最后最大得那个正数得集合就是结果

论坛徽章:
0
79 [报告]
发表于 2010-09-20 11:20 |只看该作者
不错啊

论坛徽章:
0
80 [报告]
发表于 2010-09-21 02:06 |只看该作者
居然没几个对的,前面唯一一个点睛之笔的实现,却被淹没在了一堆错误答案之中....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP