一、题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
二、思路
简单地说,
- 创建一个新的空序列,用来存储打印出来的数字;
- 按顺时针分4次取(最上一行、最右一列、最下一行、最左一列);每次取完剩下的矩阵,当作一个新的矩阵,再次循环这个过程。
举例
- 输入一个矩阵
matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
- 按照顺时针取4次后,即取完「第一轮」后,
- 对于剩下的新矩阵,再循环一次过程。取完「第二轮」的前三步,矩阵就空了,那么停止循环。
三、Python 实现
# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
res = []
while (matrix):
# 取第一行
res += matrix.pop(0)
# 取最右列
if matrix and matrix[0]:
for row in matrix:
res.append(row.pop())
# 取最下一行
if matrix:
res += matrix.pop()[::-1]
# 取最左列
if matrix and matrix[0]:
for row in matrix[::-1]:
res.append(row.pop(0))
return res
四、细节剖析
在我复盘代码的时候,发现了很多细节处,一一弄清楚。
- 1.
matrix.pop(0)
和matrix.pop()
的分别在哪里? - 2.
matrix.pop(0)
和row.pop(0)
的分别在那里? - 3.
res += matrix.pop(0)
可以改成res.extend( matrix.pop(0) )
吗?可以改成res.append( matrix.pop(0) )
吗? - 4.为什么
if matrix and matrix[0]:
中除了限制「剩下的矩阵不为空」,还要限制条件matrix[0]
?为什么有的时候又不需要这个条件
想了好久。
因为,在对列取数的时候,要先对每一行进行循环,取每一行的最后(前)一位数,即是最右(左)边一列数了。所以,不仅要有矩阵,还要保证一定要有行,不能是空的。
「特例」:输入一个矩阵 matrix = [[1],[2],[3],[4],[5]]
1 |
2 |
3 |
4 |
5 |
按照我们的思路:
- 先取第一行,即1;
- 剩下的矩阵
matrix = [[2],[3],[4],[5]]
,再取最右一列,即2,3,4,5; - 这时候就没有行了,只剩下空的矩阵。如果不限制
matrix[0]
,在res.append(row.pop(0))
会报错pop from empty list
。