手撕题常客,不是很难,但是思路比较多。
题目
给出一个 n × n n\times n n×n数组,按照回字形(“向右、向下、向左、向上”循环)打印,例如:
输入 n = 3 n=3 n=3,即数组:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]蛇形输出结果:
[1, 2, 3, 6, 9, 8, 7, 4, 5]
思路
1.方向、边界与修改
这是比较直接的思路,给定一个方向d
,分别指示下一步游标(i,j)
要移动的量,并给出一个边界,移动到触碰边界时修改方向和边界的值。
- 该方法较为常规,写得不规范的话容易数组越界。
详细代码略,只给出构建原 n × n n\times n n×n 矩阵的代码以供下一步使用。
# prepare-origin matrix-data
n = 4 # size of matirx, for example, which is `4x4`
a = [[(i+1)+j*n for i in range(n)] for j in range(n)]
for line in a:
print(line)
2.寻找规律
- 向当前一个方向移动的最大步数记为
next_step
- 则
next_step
符合规律 n , n − 1 , n − 1 , n − 2 , n − 2...1 , 1 n,n-1,n-1,n-2,n-2...1,1 n,n−1,