2019软件工程第三次作业

一.问题描述

1.题目:最大连续子数组和(最大子段和)
2.背景
  问题: 给定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.题目分析
   定义数组名为arr,如果数组为空,直接返回为0;sum代表当前连续子数组的和,max代表当前连续子数组的最大和;如果sum小于0,则抛弃当前子数组,重新开始计算子数组的值,反之,sum += arr[i]。
2.算法流程图
         
                    图1
3.源代码

public class third 
{

    public static int maxAddOfArray(int[] arr) 
    {
        int max = 0;
        int sum = 0;
        if (arr == null || arr.length == 0) {
            return 0;
        }
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
            if (sum > max) 
            {
                max = sum;
            }
            if(sum<=0)
                {
                sum = 0;
                }
        }
        return max;
    }

}

coding地址https://git.dev.tencent.com/pqqqqqq/max.git

三.单元测试

在判定/条件覆盖测试中设计测试用例。代码如下:

package second;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class testThird {

    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void test1() {
        int[] arr1={};
        int sum=third.maxAddOfArray(arr1);
        assertEquals(0, sum);
    }
    
    @Test
    public void test2() {
        int[] arr2={-8,2,6,-5,-1};
        int sum=third.maxAddOfArray(arr2);
        assertEquals(8, sum);
    }
        
@Test
    public void test3() {
        int[] arr3={-1,-2,-6,5,9};
        int sum=third.maxAddOfArray(arr3);
        assertEquals(14, sum);
}
        @Test
    public void test4() {
        int[] arr4={-1,-2,-6,-5,-9};
        int sum=third.maxAddOfArray(arr4);
        assertEquals(0, sum);
    }
    
}

四.测试结果

运行结果如图2所示
         
                        图2

猜你喜欢

转载自www.cnblogs.com/jiao6/p/10728400.html