我选择的题目:
最大连续子数组和(最大子段和)
问题内容: 给定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
一、算法思路与流程图
(1)算法思路:
我的思路非常简单,即让输入的数计算出所有的子段和,经过比较后便得出最大子段和。
具体先定义一个变量n,用来表示这组数据有几个数字,随后定义数组a输入所有的数字,定义一个临时子段和temp,从左至右,每加上一个数字便和前一回合的temp比较大小,大的话便覆盖掉前一个temp,反之小的话就保持原先的temp,因此最后比完之后的值一定就是最大子段和。
(2)流程图:
二、代码与测试
(1)主要算法代码:
public static int q(int[] a,int n)
{
int maxSum=0; //最大子段和
int temp=0; //临时子段和
for(int i=0;i<n;i++)
{
temp=0;
for(int j=i;j<n;j++)
{
temp+=a[j];
if (temp>maxSum)
maxSum=temp;
}
}
System.out.println("The largest sub-segment sum is(最大子段和):"+maxSum);
return maxSum;
}
(2)测试部分:
package RJGC;
import static org.junit.Assert.*;
import org.junit.Test;
public class Vo3NewTest {
@Test
public void test1() {
int[] a = {-1,-2,-3,-4,-5,-6};
new Vo3();
assertEquals(0,Vo3.q(a, 6));
}
@Test
public void test2() {
int[] a = {-2,11,-4,13,-5,-2};
new Vo3();
assertEquals(20,Vo3.q(a, 6));
}
@Test
public void test3() {
int[] a = {-1,-2,-3,100,-5,-2};
new Vo3();
assertEquals(100,Vo3.q(a, 6));
}
}
(三组测试皆通过)
三、总结体会
个人觉得只有我们切身动手去做了,才会对我们的编程技能有所提高,同时在这次作业中我也更加深刻的理解了单元测试的知识,并在课下查资料,学习各种覆盖方法的使用及其优缺点,随着软件课程的深入,作业次数的增加,渐渐的感觉到markdown排版使用的更加娴熟。