二维整数数组中最大矩形子数组的和
一、作业要求:
1,以指定格式的文本文件形式输入数组。
2,数组由一维变为二维。
3,熟练使用git常用命令将作业签入代码版本控制平台。
4,给出单元测试/代码覆盖率的最终覆盖率的报告,撰写博客。
二、求最大矩形子数组的和
初始数据:
题目要求:
二维数组的子数组必须是矩形的,求出最大的矩形子数组之和,显示矩形的长宽和位置信息
例:
解决思路:
先找出所有的矩形块,计算其结果存储在列表中,再找出最大的结果
实现代码:
# 读取文件内容 def readFile(path): # 读取文件 with open(path) as f: lines = f.readlines() return lines # 将读取到的内容转换成二维列表 def createList(lines): resultList = [] row = int(lines[0]) for i in range(2, 1 + row): resultList.append(lines[i][:-1].split(',')) resultList.append(lines[-1].split(',')) return resultList # 找出所有矩形子数组,并计算出子数组的结果,记录矩形的长宽及位置信息 def addresult(lists): global ResultList for i in range(1, len(lists[0]) + 1): # 控制矩形的长10 for j in range(1, len(lists) + 1): # 控制矩形的宽4 for k in range(0, len(lists) - j + 1): # 控制矩形的起始行 for m in range(0, len(lists[0]) - i + 1): # 控制矩形的起始列 Rectanglesum = 0 for n in range(k, k + j): for o in range(m, m + i): Rectanglesum = Rectanglesum + int(lists[n][o]) ResultList.append( [Rectanglesum, str('矩形的长:' + str(i)), str('矩形的宽' + str(j)), str('矩形的起始行' + str(k + 1)), str('矩形的起始列' + str(m + 1)), str('矩形的结束行' + str(k + j)), str('矩形的结束列' + str(m + i))]) return ResultList # 找出和最大的矩形子数组 def findMax(lists): maxlistsum = -99999 maxlist = [] for i in lists: if i[0] > maxlistsum: maxlistsum = i[0] maxlist.clear() maxlist.append(i) return maxlist def main(filepath): global ResultList ResultList = [] # 读取文件 dateLines = readFile(filepath) # 创建二维列表 erweiList = createList(dateLines) # 获取矩形数组结果集 result = addresult(erweiList) # print(ResultList) # 找出最大子数组 return findMax(result) if __name__ == '__main__': # 定义全局变量 ResultList = []
编写测试类:
import unittest from 大三下学期Python.Rectangle import main class Test(unittest.TestCase): def test_main1(self): self.assertEqual(main('list.txt'), [[964, '矩形的长:5', '矩形的宽3', '矩形的起始行3', '矩形的起始列4', '矩形的结束行5', '矩形的结束列8']]) def test_main2(self): self.assertEqual(main('lianjie.txt'), [[383, '矩形的长:3', '矩形的宽1', '矩形的起始行5', '矩形的起始列1', '矩形的结束行5', '矩形的结束列3']])
测试结果:
代码覆盖率测试:
1、打开cmd安装coverage
pip install coverage
2、运行.py程序
在cmd命令提示符中输入
coverage run Rectangle.py
运行结果:
3、查看结果:
在cmd命令提示符中输入
coverage report
运行结果:
4、常看HTML版的运行报告:
在cmd命令提示符中输入
coverage html
运行完成后会在该目录下生成htmlcov文件夹,打开Rectangle_py.html文件
HTML版的覆盖率测试结果:
效能分析:
使用pycharm专业版的性能分析器进行效能分析,得到结果如图