剑指offer -- 顺时针打印矩阵 Python多种解法

顺时针打印矩阵

数组处理类型的题目,每种情况列举将比较麻烦。

方法一,顺时针打印就是按圈数循环打印,一圈包含两行或者两列,在打印的时候会出现某一圈中只包含一行,要判断从左向右打印和从右向左打印的时候是否会出现重复打印,同样只包含一列时,要判断从上向下打印和从下向上打印的时候是否会出现重复打印的情况

    def printMatrix(self, matrix):
        if not matrix:
            return []
        res = []
        row = len(matrix)
        col = len(matrix[0])
        circle = (min(row, col) - 1) // 2 + 1 #循环的次数
        for i in range(circle):
            for j in range(i, col - i):
                res.append(matrix[i][j])
            for j in range(i + 1, row - i):
                res.append(matrix[j][col - i - 1])
            for j in range(col - i - 2, i - 1, -1):
                if row - i - 1!=i:
                    res.append(matrix[row - i - 1][j])
            for j in range(row - i - 2, i, -1):
                if col - i - 1!=i:
                    res.append(matrix[j][i])
        return res

or 设置圈子的上下左右范围会直观理解一点:

    def printMatrix(self, matrix):
        if not matrix:
            return []
        res = []
        row = len(matrix)
        col = len(matrix[0])
        circle = (min(row, col) - 1) // 2 + 1
        left,top,right,buttom = 0,0,col-1,row-1
        for i in range(circle):
            for j in range(left,right+1):
                res.append(matrix[i][j])
            for j in range(top+1,buttom+1):
                res.append(matrix[j][right])
            if top!= buttom:
                for j in range(right-1,left-1,-1):
                    res.append(matrix[buttom][j])
            if left!=right:
                for j in range(buttom-1,top,-1):
                    res.append(matrix[j][left])
            left += 1
            right -= 1
            top += 1
            buttom -=1
        return res

方法二:矩阵旋转,每次取矩阵的第一行,任何逆时针旋转再取第一行。

def printMatrix(self, matrix):
        res = []
        while matrix:
            res += matrix.pop(0)
            matrix =zip(*matrix)[::-1]
        return res

或者一行。。

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值