软件工程(2018)第三次个人作业
一、最大连续子数组和(最大子段和)
- 背景
问题: 给定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。-- 引用自《百度百科》
二、解决方法
-
暴力解法
定义数组用于记录输入的数字串,再定义整数用于记录当前连续的子数组之和以及之前记录的子数组之和,并取其最大值保存在max中。
核心代码截图
-
代码如下
package cal;
public class calcula{ //暴力解法
public static int Cala(int[] Array)
{
if(Array.length==0||Array==null) //如果输入长度为0 或空则直接返回数组和为零
return 0;
int j=0;
int Max=0;
for(int i=0;i<Array.length;i++)
{
if(j<=0)
j=Array[i];
else
j=j+Array[i];
if(j>Max)
Max=j;
}
return Max;
}
}
上传到Coding代码链接地址最大连续子数组和
三、测试过程
本次测试中我采用了
- 1,2,3,4,5
- -1
- -1,-2,-3,-4,-5
- -1,2,-3,-4,-5
- NULL
五个测试用例,涵盖了各种情况,用Juint测试成功通过
测试代码
package cal;
import static org.junit.Assert.*;
import org.junit.Test;
public class calculaTest {
@Test
public void test1() {
int []Array= {1,2,3,4,5};
assertEquals(15, calcula.Cala(Array));
}
@Test
public void test2() {
int []Array= {-1};
assertEquals(0, calcula.Cala(Array));
}
@Test
public void test3() {
int []Array= {-1,-2,-3,-4,-5};
assertEquals(0, calcula.Cala(Array));
}
@Test
public void test4() {
int []Array= {-1,2,-3,-4,-5};
assertEquals(2, calcula.Cala(Array));
}
@Test
public void test5() {
int []Array= {};
assertEquals(0, calcula.Cala(Array));
}
}
四 心得体会
这次作业总体并不难,主要是考验对java junit测试工具的使用。通过这次作业,我对eclipse开发工具的使用更熟练了,而且我还通过百度来解决遇到的问题,比如eclipse启动找不到目录,百度后发现很多人也有这样的问题,通过百度搜索问题并解决,培养了自己独立解决问题的能力。