一、选择题目
问题: 给定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。二、代码编写
这部分代码主要借鉴于的这篇博客,并进行了修改。
Coding:/** * Demo类 * @author haozhirong * version 1.0 * */public class Demo { /** * 求字段和的最大值 * @return */ public int getSubarrayMax(int[] arr){ if(arr.length==0||arr==null) return 0; //当前最大连续子数组和 int max=arr[0]; //尝试计算的最大连续子数组和 int submax=arr[0]; for(int i=1;imax)//每更改完sub的值,马上更新当期最大连续子数组和 max=submax; } if(max<=0) return 0; else return max; }}
三、设计测试
1 逻辑测试方法简介
逻辑测试方法 | 介绍 |
---|---|
语句覆盖 | 每条语句至少执行一次 |
判定覆盖 | 判定的每个分支至少执行一次 |
条件覆盖 | 判定的每个条件应取到各种可能的值 |
判定-条件覆盖 | 同时满足判定覆盖和条件覆盖 |
条件组合覆盖 | 判定中各种条件的每一种组合至少出现一次 |
注:参考
2 代码流程图
3 设计测试用例
在这里忽略掉循环中对数组的循环判定和arr是否为空数组的判定,共有3个判定条件。这里用条件组合覆盖结果为8种可能。
- submax<=0,submax>max,max<=0
- submax<=0,submax>max,max>0
- submax<=0,submax<=max,max<=0
- submax<=0,submax<=max,max>0
- submax>0,submax>max,max<=0
- submax>0,submax>max,max>0
- submax>0,submax<=max,max<=0
- submax>0,submax<=max,max>0
- arr数组为空
通过分析得出,以上第5、6、7种可能永远都不可能满足。所以只需覆盖其他组合。
测试用例组数 | 输入数组 | 覆盖的组合号 | 执行路径 |
---|---|---|---|
1 | {0,8,-4,-5,2} | 2,8,4 | ACBDBDADF |
2 | int [0] | 9 | |
3 | {-11,-2,-4} | 1,3 | ACADE |
4 | {0,0,0} | 1,3 | ADADE |
4 设计测试代码及结果
import static org.junit.Assert.*;import org.junit.Test;public class DemoAutoTest { @Test public void testGetSubarrayMax() { assertEquals(8,new Demo().getSubarrayMax(new int[]{0,8,-4,-5,2})); } @Test public void testGetSubarrayMax1() { assertEquals(0,new Demo().getSubarrayMax(new int[]{-11,-2,-4})); } @Test public void testGetSubarrayMax2() { assertEquals(0,new Demo().getSubarrayMax(new int[]{0,0,0})); } @Test public void testGetSubarrayMax3() { assertEquals(0,new Demo().getSubarrayMax(new int [0])); }}
测试成功