剑指offer:顺时针打印矩阵(Python)

题目描述

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

解题思路

重新描述一下题意:
输入矩阵:

01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16

需要依次打印出1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

思路1

时刻定位矩阵的左上角索引座标和右下角索引座标。当顺时针转完一圈之后,左上角的横纵索引各自加一;右下角的横纵索引各自减一。注意当左上角索引和右下角索引到达同一行/同一列时的情况。

def printMatrix(self, matrix):
    x0 = y0 = 0
    xn = len(matrix)-1
    yn = len(matrix[0])-1
    list = []
    while x0<=xn and y0<=yn:
        for y in range(y0, yn+1):
            list.append(matrix[x0][y])
        for x in range(x0+1, xn+1):
            list.append(matrix[x][yn])
        if x0 < xn:
            for y in range(yn-1, y0-1, -1):
                list.append(matrix[xn][y])
        if y0 < yn:
            for x in range(xn-1, x0, -1):
                list.append(matrix[x][y0])
        x0 += 1
        y0 += 1
        xn -= 1
        yn -= 1
    return list

思路2

我用的语言是Python!意味着也许Java和C++需要取巧才能得到答案的时候,Python可以不讲理的硬上,无脑暴力但又优美的解决…比如这道题:

def printMatrix(self, matrix):
    res = []
    while matrix:
        res += matrix.pop(0)
        if matrix and matrix[0]:
            for row in matrix:
                res.append(row.pop())
        if matrix:
            res += matrix.pop()[::-1]
        if matrix and matrix[0]:
            for row in matrix[::-1]:
                res.append(row.pop(0))
    return res

有的时候,甚至怀疑,用Python练习编程题到底是不是个好主意… 因为跳过了出题人的期待,三下五除二得到答案,结果没有很好地练到手…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章