You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

顺时针旋转正方形矩阵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循环会触发索引越界错误。

错误原因分析

原代码的核心问题在于:

  1. 旋转时的坐标计算逻辑错误,通过累加x和y更新位置的方式不符合顺时针旋转90度的坐标变换规则,导致后续循环中坐标超出矩阵边界。
  2. 循环过程中修改了外层的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:20:15