1、题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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, 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.
2、代码详解
首先需要判断每一步开始是的坐标点是否满足小于行数的一半且小于列数的一半,在最后一圈中,可能出现仅能向右走一行,仅能向右走一行向下走一列,向右走一行向下走一列向左走一行,能走完整一圈,一共四种情况。其中只有能向左走一行必然发生,不必判断,剩余的都需要判断发生条件。
首先看一些二维列表的行和列
matrix3 = [[1,2],[3,4],[5,6],[7,8],[9,10]]
rows = len(matrix3) # 行数
columns = len(matrix3[0]) # 列数
print(rows) # 5
print(columns) # 2
代码如下:
# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
# 直接一个完整的函数实现这个功能
def printMatrix(self, matrix):
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:
# 因为start下标是从0开始
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
# 终止列号 > 起始列号, 且 终止行号 > 起始行号 + 1(至少大2)
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
matrix = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]]
matrix2 = [[1],[2],[3],[4],[5]]
matrix3 = [[1,2],[3,4],[5,6],[7,8],[9,10]]
S = Solution()
print(S.printMatrix(matrix))
print(S.printMatrix(matrix2))
print(S.printMatrix(matrix3))