剑指offer-python:27.旋转矩阵and顺时针打印矩阵and逆时针打印

旋转矩阵是顺时针打印矩阵的前提。首先,学会旋转矩阵,后面就容易了。

1.旋转矩阵:如下所示,旋转效果

[[1,2,3],            [[7,4,1],
 [4,5,6],    --->     [8,5,2],
 [7,8,9]]             [9,6,3]]

技巧:使用zip

代码:这里*解包,zip压缩,zip后变成zip类型,zip会把原有矩阵从第一列开始,把每一列打包成一个元祖,把元祖强转为list达到矩阵转置的效果

def tans90(matrix):
    matrix = matrix[::-1]
    res = []
    for line in zip(*matrix):
        print('line = ',line)

 输入:[[1,2,3],[4,5,6],[7,8,9]]

输出:

line =  (7, 4, 1)
line =  (8, 5, 2)
line =  (9, 6, 3)

  这样就实现了一个矩阵的旋转(顺时针)

-------------------------------------------------------------------------------------------------------------------

2.顺时针打印矩阵,可以利用上面的方法,并把顺序打印出来,即:1-2-3-6-9-8-7-4-5.

 代码:

def spiralOrder(matrix):
    res = []
    while matrix:
        print('matrix = ',matrix)
        res += matrix.pop(0)
        matrix = list(zip(*matrix))[::-1]
    return res

输出并显示每次matrix:

matrix =  [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix =  [(6, 9), (5, 8), (4, 7)]
matrix =  [(8, 7), (5, 4)]
matrix =  [(4,), (5,)]
matrix =  [(5,)]

 res = [1, 2, 3, 6, 9, 8, 7, 4, 5]

递归的方法(leetcode,一行实现):

def spiralOrder( matrix):
    return (matrix and list(matrix.pop(0)) +
            spiralOrder(list(zip(*matrix))[::-1]))

---------------------------------------------------------------------------------------------------------------------------

3.逆时针打印:同理,使用顺时针旋转,得到的数值再逆即可。

代码:

def anti(matrix):
    res = []
    res += matrix.pop(0)[::-1]
    while matrix:
        matrix = matrix[::-1]
        matrix = list(zip(*matrix))
        print('msss=',matrix)
        res += list(matrix.pop(0))[::-1]
    return res

打印输出:

msss= [(7, 4), (8, 5), (9, 6)]
msss= [(9, 8), (6, 5)]
msss= [(6,), (5,)]
msss= [(5,)]

最后输出:

[3, 2, 1, 4, 7, 8, 9, 6, 5]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值