0%

顺时针打印矩阵(剑指offer29)

题目要求

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

1
2
3
4
5
6
7
示例 1
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
# python3定义函数的格式,代表matrix中是一个列表,列表中还有列表,最里层列表中的元素是数字,返回是一个列表,其中也是数字
def spiralOrder(self, matrix:[[int]]) -> [int]:
# 检查是否为空矩阵
if not matrix: return []
# 初始化上下左右四个边界值
l = 0
r = len(matrix[0])-1
t = 0
b = len(matrix) - 1
res = []
# 这是一个永久循环,一直到break执行,如果没有这句只会执行最外面的一层
while True:
for i in range(l, r + 1): res.append(matrix[t][i]) # left to right
t += 1
if t > b: break
for i in range(t, b + 1): res.append(matrix[i][r]) # top to bottom
r -= 1
if l > r: break
for i in range(r, l - 1, -1): res.append(matrix[b][i]) # right to left
b -= 1
if t > b: break
for i in range(b, t - 1, -1): res.append(matrix[i][l]) # bottom to top
l += 1
if l > r: break
return res

知识点

While True的作用
range函数

range函数有三个参数range(start, stop[, step]), 一般来说range函数默认从0开始,第一额参数显示,最后一个参数不显示,若步长为-1则需要start大于stop

类和函数的区别及调用,self的作用
1
2
3
4
5
6
matirix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
# 初始化一个类并且调用这个类下的函数
s = Solution()
s.spiralOrder(matirix)
>>>
[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]