声明:个人学习之用,能力有限,仅供参考。
一,思路:
第一反应先是暴力解法,利用for循环来解决。
试了试感觉人晕了,
查询了下资料,本质上是考察对代码的掌握能力。
模拟顺时针画矩阵的过程:
1.上行从左到右
2.右列从上到下
3.下行从右到左
4.左列从下到上。
最开始被N=3这个例子给绕进去了。建议自己画一个N=5的例子,更方便理解----------这里我强调的是,每次顺时针画完之后,初始点x,y需要+1,变换初始点的这个操作。
在这里引入这个理解。
这里意味着,每当遇到拐角的时候,拐角处的点,是给新的一边来画。
那翻译成术语来说,这是一个左闭右开的规则[,)
代码
#螺旋矩阵
#
def generate_matrix(n):
nums = [[0] * n for _ in range(n)]
startx, starty =0, 0 #起始点
loop, mid = n//2, n//2 #迭代次数,n为奇数时,矩阵的中心点
count = 1 #计数
for offset in range(1, loop + 1): #每循环一层偏移量加1,偏移量从1开始
for i in range(starty, n - offset): #从左至右,左闭右开
nums[startx][i] = count
count += 1
for i in range(startx, n - offset): #从上至下
nums[i][n - offset] = count
count += 1
for i in range(n - offset, starty, -1): #从右至左
nums[n - offset][i] = count
count += 1
for i in range(n - offset, startx, -1): #从下至上
nums[i][starty] = count
count += 1
startx += 1
starty += 1
if n % 2 !=0: #n为奇数时,填充中心点
nums[mid][mid] = count
return nums
写在后面:
我要是面试官,我会问你,逆时针打印呢?聊聊你的想法。