顺序打印矩阵

剑指offer原题目:顺序打印矩阵(python)

题目描述
牛客网:顺序打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

如果按照剑指offer提供的思路解题,很容易就会被边界条件搞混。这里,我们可以巧用python中的 zip 函数解答这道题目。
先贴上代码:

# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        res = []
        while len(matrix) > 0:
            res += matrix[0]
            matrix = [list(i) for i in zip(*[j[::-1] for j in matrix[1:]])]
        return res

感觉代码很简洁,事实上这个解法相对于offer上的解答要更耗时间。因为原解答只是顺序打印矩阵数字,并不像这种解法对矩阵做了修改,然后依次选取第一行输出。
下面我们以开始的例子分析一下整个过程:

  1. while第一次执行时,已经将第一行【1,2,3,4】添加至res中,对于 [j[::-1] for j in matrix[1:]],不难分析得到的是【【8,7,6,5】,【12,11,10,9】,【16,15,14,13】】。然后我们用 zip(*矩阵),得到了【【8,12,16】,【7,11,15】,【6,10,14】,【5,9,13】】的物理存储地址,所以用list还原为矩阵。
  2. 执行循环,将【8,12,16】添加至res中,然后同上先得到【【15,11,7】,【14,10,6】,【13,9,5】】,由zip得到了【【15,14,13】,【11,10,9】,【7,6,5】】。
  3. 依次执行直至matrix为空,停止。
    好了,以上就是题目的迭代过程。但是如果让你逆时针打印矩阵又该怎么办?好了,zip是个神奇的函数,对于原矩阵matrix,list(zip(*matrix))就是原矩阵的转置,如下图:
    当然了,如果不介意结构类型的话,可以当做转置。这里把原矩阵元素数组行变为了元组行。
    对于矩阵而言,顺时针打印转置矩阵就是逆时针打印原矩阵。相同的解法,原址修改一下矩阵就可以啦!
    未完待续…
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值