《最大子段和》——软件工程作业.vo3

软件工程作业.vo3

  • 我选择的题目:

最大连续子数组和(最大子段和)

问题内容: 给定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)流程图:image


二、代码与测试

(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));
	}
}

image
(三组测试皆通过)


三、总结体会

       个人觉得只有我们切身动手去做了,才会对我们的编程技能有所提高,同时在这次作业中我也更加深刻的理解了单元测试的知识,并在课下查资料,学习各种覆盖方法的使用及其优缺点,随着软件课程的深入,作业次数的增加,渐渐的感觉到markdown排版使用的更加娴熟。


附录代码:

代码部分

posted @ 2018-03-31 14:37  OMGMichael_Yang  阅读(159)  评论(0编辑  收藏  举报