数组中最大的子数组之和

一、程序分析

1、题目要求

  • 从文件中读取内容作为数组数据
  • 输出这个数组的最大联通子数组
  • 给出单元测试、代码覆盖率等报告

2、代码实现

  

def read_file(file_path,ResultLst):
data=""
with open(file_path,encoding="utf-8") as f:

data = [line.strip('\n') for line in f.readlines()]
# print(data)

row=int(data[0])
axis=int(data[1])


for i in range(2,len(data)):
lst=data[i].split(',')
# print('aaa',lst[0])

lst2=lst[0].split(',')
# print('bbb',lst2)

for j in range(2,len(lst2)):
lst2[j]=int(lst2[j])

ResultLst.append(lst2)
print('ResultLst:',ResultLst)
return row,axis

def row_max(ResultLst,row,axis,k):
row_maxsum=-9999
begin=0
end=0
for i in range(axis):
row_sum=0
for j in range(i,axis):
row_sum+=int(ResultLst[k][j])
if row_sum>row_maxsum:
row_maxsum=row_sum
begin=i
end=j

print('第',k+1,'行最大值')
print(row_maxsum)
print(begin)
print(end)
print('------------------')
return row_maxsum,begin,end


def max_total(Beign_lst,End_lst,Max_lst):
max=Max_lst[0]
for i in range(len(Beign_lst)-1):
print("len:",len(Beign_lst)-1)
print("i:", i)
if (Begin_lst[i]>End_lst[i+1]) or (End_lst[i]<Begin_lst[i+1]):
if Beign_lst[i]>End_lst[i+1]:
t=Beign_lst[i]-End_lst[i+1]
s=Beign_lst[i]
temp=0
for k in range(t):
temp+=int(ResultLst[i+1][s-k])
if temp+Max_lst[i+1]>0:
max+=temp+Max_lst[i+1]
if End_lst[i]<Beign_lst[i+1]:

print(End_lst[i],Beign_lst[i+1])
t=Beign_lst[i+1]-End_lst[i]
s=End_lst[i]
temp=0
for k in range(t-1):
temp+=min(int(ResultLst[i][End_lst[i]+1+k]),int(ResultLst[i+1][End_lst[i]]))
if temp+Max_lst[i+1]>0:
max+=temp+Max_lst[i+1]

kind=End_lst[i]-Beign_lst[i+1]



else:
max+=Max_lst[i+1]
print("process_MAXLST:",Max_lst[i])
print("process_MAX:",max)
print('resultMAX:',max)
return max


# max=0
def main(file_path,row_maxsum,begin,end):
ResultLst = []
Max_lst=[]
Begin_lst=[]
End_lst=[]


row,axis=read_file(file_path,ResultLst)

for i in range(row):
print("i.this:",i)
row_maxsum,begin,end=row_max(ResultLst,row,axis,i)
Max_lst.append(row_maxsum)
Begin_lst.append(begin)
End_lst.append(end)
print('Max_lst:',Max_lst)
print('Begin_lst:',Begin_lst)
print('End_lst:',End_lst)
return Begin_lst,End_lst,Max_lst

if __name__=="__main__":
file_path = 'C:/Users/Sun Tianwen/Desktop/data.txt'
Begin_lst = []
End_lst=[]
Max_lst=[]
row_maxsum = 0
begin = 0
end = 0
Begin_lst,End_lst,Max_lst=main(file_path,row_maxsum,begin,end)
max_total(Begin_lst, End_lst, Max_lst)

3、运行结果

 

 二、单元测试

使用unittest进行单元测试

1、测试代码

import unittest
import max_array2 as m


class MyTestCase(unittest.TestCase):
    def test1(self):
        row_maxsum = 0
        begin = 0
        end = 0
     file_path='C:/Users/Sun Tianwen/Desktop/TestCase1.txt' Begin_lst, End_lst, Max_lst
= m.main(file_path,row_maxsum, begin, end) result=m.max_total(Begin_lst, End_lst, Max_lst) self.assertEqual(result, 31) def test2(self): row_maxsum = 0 begin = 0 end = 0
     file_path='C:/Users/Sun Tianwen/Desktop/TestCase2.txt' Begin_lst, End_lst, Max_lst
= m.main(file_path,row_maxsum, begin, end) result = m.max_total(Begin_lst, End_lst, Max_lst) self.assertEqual(result, 60) if __name__ == '__main__': unittest.main()

2、测试结果

 

 

三、代码覆盖率

1、安装coverage

pip install coverage

2、运行.py程序

在cmd命令提示符中输入

coverage run max_array2.py

如图所示

 

然后再输入coverage report

 

 最后一列就是覆盖情况,可以看到总覆盖率只有79%。

接下来执行

coverage html

生成htmlcov文件夹,

 

 打开文件夹

 

 

 打开max_array2.html文件

 

 

 

 红色标识的部分就是未被执行的代码。

四、效能分析

使用pycharm的profile进行效能分析,得到结果如图

 

posted @ 2021-03-31 18:46  qwer123875  阅读(71)  评论(1)    收藏  举报