题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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练习编程题到底是不是个好主意… 因为跳过了出题人的期待,三下五除二得到答案,结果没有很好地练到手…