【算法题】剑指offer之顺时针打印矩阵-python实现

顺时针打印矩阵

在这里插入图片描述
对于下面代码的两点解释

1.pop对于矩阵而言能否pop出某一行?

res += matrix.pop(0)

经过资料查找,所有的解释都是同一种说法:pop只是对于list进行操作,每次只能pop出一个元素。但是经过代码测试,pop函数可以pop出矩阵/二维数组的某一行(pop出某一列需要借助for循环)

测试代码如下:

a = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
a.pop(0)
print(a)

结果:

[[5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

2.对列进行操作的时候,判断语句为什么是if matrix and matrix[0]而不是if matrix?
举个例子:
      a = [[1],[2],[3],[4],[5]]
      经过res += matrix.pop(0)
      a = [[2],[3],[4],[5]]
      再经过

            if matrix and matrix[0]:
                for row in matrix:
                    res.append(row.pop())

      a = [[],[],[],[]]
      对于此时的a,matrix为真,matrix[0]为假。
      因为[[],[],[],[]]相当于[False,False,False,False]
因此,在对列进行操作时,可能在对首列或者尾列操作之后形成[[],[],[],[]]的情形,一次需要使用if matrix and matrix[0]进行判断。

# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        res = []
        while matrix :
            # 下面不能用append,append只接受一个元素
            #pop可以移除矩阵中的某一行
            #a = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
            #a.pop(0)--->a = [[5,6,7,8],[9,10,11,12],[13,14,15,16]]
            res += matrix.pop(0)
            if matrix and matrix[0]:
                for row in matrix:
                    res.append(row.pop())
            if matrix:
                #先pop出最后一行,在进行取逆操作
                res += matrix.pop()[::-1]
            if matrix and matrix[0]:
                #逆序取矩阵中的每一行
                for row in matrix[::-1]:
                    res.append(row.pop(0))
        return res

你可能感兴趣的:(算法题,python,数据结构,算法,栈)