软件工程(2019)第三次个人作业

一、题目

题目:最大连续子数组和(最大子段和)
问题: 给定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,从arr[1]开始逐个进行相加,与最大值比较,并不停地更替最大值。

2.图解:

三、流程图

四、代码

def maxsum(arr):
    max = int(arr[0])
    sum = 0
    if len(arr)==0:
        return 0
    else:
        for i in arr:
            if sum < 0:
                sum = int(i)
            else:
                sum += int(i)
            if sum > max:
                max = sum
    if max < 0:
        max = 0
    return max
if __name__ == '__main__':
    # numbers=[-2,11,-4,13,-5,-2]
    numbers=eval(input("请输入一个整数数组:"))
    print(maxsum(numbers))

代码戳这儿https://dev.tencent.com/u/leeqiuye/p/maxArray/git

五、单元测试

1.条件覆盖

采用条件覆盖的方法。
设计如下测试用例
(1)全是负数,arr1=[-2,-3,-4,-6,-8,-1],max=0
(2)一般情况,arr3=[-2,11,-4,13,-5,-2], max=20
(3)全是正数,arr2=[2,3,4,6,8,9],max=32
测试代码如下:

import unittest
from sum import *
arr1=[-2,-3,-4,-6,-8,-1]#0
arr2=[2,3,4,6,8,9] #32
arr3=[-2,11,-4,13,-5,-2]#20
class TestMaxsum(unittest.TestCase):
    def test1(self):
        self.assertEqual(0,maxsum(arr1))
    def test2(self):
        self.assertEqual(32,maxsum(arr2))
    def test3(self):
        self.assertEqual(20,maxsum(arr3))

if __name__=='__main__':
    print()
    unittest.main()

2.测试结果

posted on 2019-04-20 22:28  sishengxq  阅读(142)  评论(0编辑  收藏  举报

导航