《最大子段和》——软件工程作业.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排版使用的更加娴熟。


附录代码:

代码部分

转载于:https://www.cnblogs.com/yanghaobaba/p/8682116.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值