软件工程(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()