解题思路:
创建二维数组:为了存储这些数字,我们需要创建一个n×n的二维数组。这可以通过嵌套的列表推导式来实现。
蛇形填充:接下来,我们需要按照蛇形顺序填充这个二维数组。这需要我们定义四个变量(或边界)来表示当前填充的层的上、下、左、右边界。我们从右上角开始,首先向右填充,然后向下,再向左,最后向上,完成一层的填充。然后,我们更新边界,继续填充下一层,直到所有的数字都被填充完毕。
更新变量:在填充的过程中,我们需要一个变量来跟踪当前要填充的数字,以及四个边界变量来定义当前层的填充范围。
返回结果:最后,当所有的数字都被填充完毕后,我们返回这个二维数组作为结果。
知识点:
二维数组:在Python中,二维数组可以通过嵌套的列表来实现。列表推导式是创建二维数组的一种简洁方式。
循环和条件判断:在填充二维数组时,我们需要使用循环来遍历数组,并使用条件判断来决定当前应该填充哪个数字以及填充的方向。
变量更新:在填充的过程中,我们需要不断更新当前要填充的数字以及四个边界变量。
代码详解:
以下是一个可能的Python实现:
def solution(n: int) -> list:
# 创建二维数组
a = [[0] * n for _ in range(n)]
# 定义边界
top, bottom = 0, n - 1
left, right = 0, n - 1
number = 1 # 当前要填充的数字
while number <= n * n:
# 从右到左填充上边
for i in range(right, left - 1, -1):
a[top][i] = number
number += 1
top += 1
# 从上到下填充右边
for i in range(top, bottom + 1):
a[i][left] = number
number += 1
left += 1
# 如果还没有填充完,继续从下到上填充下边
if top <= bottom:
for i in range(left, right + 1):
a[bottom][i] = number
number += 1
bottom -= 1
# 如果还没有填充完,继续从左到右填充左边
if left <= right:
for i in range(bottom, top - 1, -1):
a[i][right] = number
number += 1
right -= 1
return a
上述代码中的注释和变量命名都是为了更清晰地解释算法的思路和步骤。在实际应用中,可以根据需要进行适当的调整和优化。当然,也可以有其他的方法。笔者最初解答时使用的变量较少,看起来比较简洁,但可读性不强,读者可以自行斟酌选择哪一个方法。以下为第二种方法的python代码:
def solution(n: int) -> list:
# 初始化变量
i, j, number = 0, 0, 1
t = 0
# 创建二维数组
a = [[0] * n for _ in range(n)]
# 填充二维数组
while number <= n * n:
j = n - 1 - t
for i in range(t , n - t):
a[i][j] = number
number += 1
i = n - 1 - t
for j in range(n - 2 - t, t - 1, -1):
a[i][j] = number
number += 1
j = t
for i in range(n - 2 - t, t-1, -1):
a[i][j] = number
number += 1
i = t
for j in range(t+1, n - t-1):
a[i][j] = number
number += 1
t += 1
# 格式化输出(这里仅为了返回正确的结果,实际打印格式在测试时处理)
return a
if __name__ == '__main__':
# 测试函数
print(solution(4) == [[10, 11, 12, 1], [9, 16, 13, 2], [8, 15, 14, 3], [7, 6, 5, 4]])
print(solution(5) == [[13, 14, 15, 16, 1], [12, 23, 24, 17, 2], [11, 22, 25, 18, 3], [10, 21, 20, 19, 4], [9, 8, 7, 6, 5]])
print(solution(3) == [[7, 8, 1], [6, 9, 2], [5, 4, 3]])