【剑指offer】面试题 29:顺时针打印矩阵

来源:互联网 发布:js如何理解面向对象 编辑:程序博客网 时间:2024/05/19 02:29

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
例如,如果输入如下矩阵: 
1     2    3    4 
5     6    7    8 
9    10  11  12 
13  14  15  16 
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

时间限制:1秒 空间限制:32768K 热度指数:128924
本题知识点: 数组


思路


顺时针打印就是按圈数循环打印,一圈包含两行或者两列,

在打印的时候会出现某一圈中只包含一行,

要判断从左向右打印和从右向左打印的时候是否会出现重复打印,

同样只包含一列时,要判断从上向下打印和从下向上打印的时候

是否会出现重复打印的情况





参考代码

# -*- coding:utf-8 -*-class Solution:    # matrix类型为二维列表,需要返回列表    def printMatrix(self, matrix):        # write code here        printArr = []        if matrix == None:            return        if matrix == []:            return []        start = 0               # 每次循环时起始点        rows = len(matrix)   # 列数        columns = len(matrix[0])   # 行数        while columns > 2 * start and rows > 2 * start:            endX = columns - 1 - start            endY = rows - 1 - start            # 从左到右将数字存入printArr            for i in range(start, endX+1):                number = matrix[start][i]                printArr.append(number)            # 从上到下将数字存入printArr            if start < endY:                for i in range(start+1, endY+1):                    number = matrix[i][endX]                    printArr.append(number)            # 从右到左将数字存入printArr            if start < endX and start < endY:                for i in range(endX-1, start-1, -1):                    number = matrix[endY][i]                    printArr.append(number)            # 从下到上将数字存入printArr            if start < endX and start < endY-1:                for i in range(endY-1, start, -1):                    number = matrix[i][start]                    printArr.append(number)            start += 1        return printArr