一、题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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. 按顺时针分4次取(最上一行、最右一列、最下一行、最左一列);每次取完剩下的矩阵,当作一个新的矩阵,再次循环这个过程。
举例
  1. 输入一个矩阵 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

  1. 按照顺时针取4次后,即取完「第一轮」后,
  2. 对于剩下的新矩阵,再循环一次过程。取完「第二轮」的前三步,矩阵就空了,那么停止循环。

三、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. 先取第一行,即1;
  2. 剩下的矩阵matrix = [[2],[3],[4],[5]],再取最右一列,即2,3,4,5;
  3. 这时候就没有行了,只剩下空的矩阵。如果不限制matrix[0],在res.append(row.pop(0))会报错pop from empty list