顺时针旋转正方形矩阵90度:首循环有效,后续循环索引越界
正方形矩阵顺时针旋转90度的代码问题
问题说明
我需要实现正方形矩阵顺时针旋转90度的功能,但当前Python代码首次循环能正常运行,进入下一循环就触发索引越界错误。
原代码
from typing import List class Solution: def rotate(self, matrix: List[List[int]]) -> None: for i in range(0, len(matrix)//2): x = i y = len(matrix)-i-1 for j in range(i,len(matrix)-i-1): prev = matrix[i][j] l = i r = j for k in range(1,5): l = l + x r = r + y curr = matrix[l][r] matrix[l][r] = prev prev = curr temp = x x = y y = temp*(-1) x = x + 1 y = y - 1
输入输出示例
- 输入:
[[1,2,3],[4,5,6],[7,8,9]]
- 预期输出:
[[7,4,1],[8,5,2],[9,6,3]]
- 当前仅运行j循环首个周期的输出:
[[7,2,1],[4,5,6],[9,8,3]]
继续执行j循环会触发索引越界错误。
错误原因分析
原代码的核心问题在于:
- 旋转时的坐标计算逻辑错误,通过累加
x和y更新位置的方式不符合顺时针旋转90度的坐标变换规则,导致后续循环中坐标超出矩阵边界。 - 循环过程中修改了外层的
x和y变量,破坏了下一次循环的初始偏移量,进一步引发索引越界。
修正方案
方案1:转置+反转每行(简单直观)
通过先转置矩阵,再反转每一行的方式实现顺时针旋转90度,代码简洁且不易出错。
from typing import List class Solution: def rotate(self, matrix: List[List[int]]) -> None: n = len(matrix) # 转置矩阵:交换matrix[i][j]和matrix[j][i] for i in range(n): for j in range(i, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] # 反转每一行 for row in matrix: row.reverse()
方案2:逐层交换元素(对应原思路修正)
针对原代码的逐层处理思路,修正坐标计算逻辑,直接对每层的四个对应位置元素进行循环交换:
from typing import List class Solution: def rotate(self, matrix: List[List[int]]) -> None: n = len(matrix) # 从外层到内层逐层处理 for i in range(n // 2): start = i end = n - 1 - i # 遍历当前层的每个元素(排除最后一个,避免重复交换) for j in range(start, end): # 保存当前元素 temp = matrix[start][j] # 左下角元素移到左上角 matrix[start][j] = matrix[n - 1 - j][start] # 右下角元素移到左下角 matrix[n - 1 - j][start] = matrix[end][n - 1 - j] # 右上角元素移到右下角 matrix[end][n - 1 - j] = matrix[j][end] # 原左上角元素移到右上角 matrix[j][end] = temp
上述两种方案均可正确实现矩阵顺时针旋转90度,且不会出现索引越界问题。
内容的提问来源于stack exchange,提问作者Sankalp Rawat
相关产品推荐
相关产品推荐

