旋转图像
题目:旋转图像 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
如下图所示,我们可以把3*3矩阵从外到里分为Math.floor(n / 2) = 1环,每环的数据按顺时针旋转交换数值。
下面的矩阵只有一环:1 2 3 6 9 8 7 4,将对应四个方向上值交换即可

如果是4*4矩阵,可以分为Math.floor(n / 2) = 2环

其它的矩阵都是一样的操作,无非就是在上述矩阵上加减环
具体实现步骤:
- 将矩阵分为
i = Math.floor(n / 2)个可旋转的环 - 每一环按
j = i到j <= n - 1 - i进行数值遍历替换,这里的length = (n - 1 - i) - i永远会是4或者2,保证每环的一行数据完整遍历且不越界 举个栗子4*4的矩阵旋转: 第一环坐标为:(0,0) (0,1) (0,2) (0,3),(0,0)代表第一环的第i(0)个交换值 第二环坐标为:(1,1) (1,2) - 计算四个点(最内层2*2旋转同样适用)
每个坐标值都有对应的四个点,以第一环
(0, 1)为例四个交换坐标为:(0,1) (1, 3) (3, 2) (2, 0),观察规律我们可以得到四个点的计算公式:(i, j) (j, n - 1 - i) (n - 1 - i, n - 1 - i) (n - 1 - j, i),将四个点的值按顺时针替换即可。
最总代码:
const rotateMatrix = (matrix) => {
// 交换列
const circle = Math.floor(matrix.length / 2)
// 将矩阵分为Math.floor(n / 2)个环
for (let i = 0; i < circle; i++) {
// 从 i 遍历到matrix[i].length - 1 - i
for (let j = i; j < matrix[i].length - 1 - i; j++) {
// 四个坐标点互相交换值
;[
matrix[i][j],
matrix[j][matrix.length - 1 - i],
matrix[matrix.length - 1 - i][matrix.length - 1 - j],
matrix[matrix.length - 1 - j][i]
] = [
matrix[matrix.length - 1 - j][i],
matrix[i][j],
matrix[j][matrix.length - 1 - i],
matrix[matrix.length - 1 - i][matrix.length - 1 - j]
]
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
如果是逆势针旋转,步骤同上只需要将(i, j) (j, n - 1 - i) (n - 1 - i, n - 1 - i) (n - 1 - j, i)坐标值的交换顺序变为逆时针即可。
提示
使用解构赋值来避免多余变量的创建
上次更新: 2025/09/05, 8:09:00