题目描述
  题目(1):最大连续子数组和(最大子段和)
  问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如
  a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定
  义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
  例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。

题目分析
  从题目的描述我们知道一共有两种情况:第一种,所给整数全为负数时子段和为0。第二种,所给整数不全为负数,可以找到数组中某一序列得到最大子段和。

解决方案

  1.穷举法:

  首先先定义一个变量Max作为最后得到的最大子段和并给Max赋初值为0(此时Max的值恰好符合所给整数全为负数的情况)。其次定义一个累加器变量Account,利用两层for循环,从第i(i>=0)个数组元素开始遍历到最后一个元素并进行累加将累加值赋给Account,将累加过程中的最大值与Max进行比较,若Account>Max则将Max的值替换为Account的值,其余情况Max的值不变。两层for循环执行结束后所得到的Max的值即为所求。

  2.相关代码如下:

  该算法时间复杂度T(n)=O(n^2)。

  3.代码流程图如下:


用判定条件覆盖设计测试用例如下:
  上图中涉及的条件有:i<b,i>=b,j<b,j>=b,Account>Max,Account<=Max
  设计如下用例
  Test1:b=5,a[5]={-1,-2,-3,-4,-5} 路径:abcdefhjk
  Test2:b=6,a[6]={-2,4,11,-3,-14,4} 路径:abcdefgijk
  同时满足各点判定条件。
测试及运行结果

  1.运行结果截图:


  2.测试代码如下:

  在我编写测试代码过程中第一次定义数组a时使用了int类型,结果在进行测试时报错为:指针算法是不可验证的。后经过查阅资料改用CLR数组进行定义解决了这个问题。

  3.自动测试结果如下:

心得体会
  这是最后一次个人项目作业,也是对之前学习过程的一次检验。这次项目的问题很容易理解,代码编写也相对简单,大部分时间都花在了如何在软件调试运行过程中得到自己想要的结果。通过这次作业我也找出了我的一些不足之处,希望在接下来的结对和团队项目中能努力做得更好。

可运行完整代码地址
https://git.dev.tencent.com/dtid_d6b0780bdefc3f9c/rjgczuidaziduanhe.git

posted on 2019-04-15 10:31  李佳昕  阅读(358)  评论(0编辑  收藏  举报