二维整数数组中最大矩形子数组的和

一、作业要求:

  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专业版的性能分析器进行效能分析,得到结果如图

 

 

 

 

 

 

 

posted @ 2021-04-01 14:06  OHHO  阅读(157)  评论(2)    收藏  举报