欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

顺(逆)时针打印矩阵

程序员文章站 2022-03-23 09:37:35
顺时针打印矩阵剑指 Offer 29. 顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]解决方法先把最前面的元素提取了。然后将剩下元素逆时针旋转 90 度,再依次循环进行。逆时针:竖排提取 → 元素翻转 。def spiralOrder(self, matrix: List[List[int]]) -> List[int]:...
顺时针打印矩阵

剑指 Offer 29. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
解决方法

先把最前面的元素提取了。然后将剩下元素逆时针旋转 90 度,再依次循环进行。

逆时针:竖排提取 → 元素翻转 。

def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    res = []
    while matrix:
        res += matrix.pop(0)  # 列表后面可以追加元组,相当于 extend
        # res.extend(matrix.pop(0))  # 使用这一句代替上面也行
        # res = res + matrix.pop(0)  # 列表却不可以连接元组 错误
        matrix = list(zip(*matrix))[::-1]
    return res

其中,matrix.pop(0) 是元组类型,追加 +=到了列表之后。使用连接(concatenate)+ 会报错的。

这一点微妙之处,也能看出 Python 实在是很灵活。
例如:

a = [1, 2, 4]
a += {5, 6, 7}
a += 8, 9
print(a)

结果:[1, 2, 4, 5, 6, 7, 8, 9]


扩展:逆时针打印矩阵
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    matrix = list(zip(*matrix))  # 转置
    res = list(matrix.pop(0))
    while matrix:
        matrix = list(zip(*matrix))[::-1]
        res += matrix.pop(0)
    return res

需要先转置提取,才能逆时针旋转,并提取元素。

总结

要求格式为:List[List[int]

  • 顺时针旋转 90 度:list(map(list, zip(*(matrix[::-1]))))
  • 逆时针旋转 90 度:list(map(list, zip(*matrix))))[::-1]
  • 转置:list(map(list, zip(*matrix))))

注意:Python 语法比较简洁,其中上面语法就涉及到:反序、解包、打包、映射等,若看不懂可以在纸上画画,好好理解一下。

转置完再翻转就是逆时针,而翻转完再转置就是顺时针旋转了。

本文地址:https://blog.csdn.net/weixin_43932942/article/details/107886072