题目选择
题目(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。
样例代码:Coding.net
根据题目,代码如下
package com.edu.sau;
/**
*
* @author HuangShuYe
* @version 1.0
*
*/
public class myArray {
public static void main(String[] args)
{
int result = maxSubSum(new int[] {1,2,3,4,5,6});
System.out.printf("%d",result);
}
/**
*
* @param list 数组
* @return 最大字段和
*/
public static int maxSubSum(int[] list)
{
int n = list.length;
int currSum = 0;
int maxSum = 0;
for (int i = 0; i < n; i++)
{
currSum+= list[i];
if (currSum > maxSum )
{
maxSum = currSum;
}
if (currSum < 0)
{
currSum = 0;
}
}
return maxSum;
}
}
选择测试方法、设计测试用例
流程图如下
本次使用选择条件组合覆盖的测试方法
有流程图可知共有两个判断条件,所以有2^2=4种组合,舍弃不可能的情况共有三种:
1.currSum>maxSum,currSum>=0
2.currSum<=maxSum,currSum<0
3.currSum<=maxSum,currSum>=0
因此设计测试用例如下:
利用自动测试工具对程序进行测试
测试代码如下
package com.edu.test;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import com.edu.sau.myArray;
/**
*
* @author HuangShuYe
*
*/
public class myArrayTest {
@Test
public void testMaxSubSum()
{
assertEquals(10, myArray.maxSubSum(new int[] {1,2,3,4}));
}
@Test
public void testMaxSubSum1()
{
assertEquals(6, myArray.maxSubSum(new int[] {-11,1,2,3}));
}
@Test
public void testMaxSubSum2()
{
assertEquals(7, myArray.maxSubSum(new int[] {3,-1,2,3}));
}
}
测试运行结果
如图所示,按照上图中的三个条件组合覆盖测试用例依次测试,测试全部通过。