发布于2026-07-04 阅读(0)
扫一扫,手机访问
顺时针旋转90°的核心是什么?其实很简单,就是“转置+每行反转”。先交换 matrix[i][j] 与 matrix[j][i] 实现转置,再对每行元素做反转。这套流程逻辑清晰、容易实现,而且足够安全——即便出错,也比直接手算坐标映射容易排查。

Ja va 中处理二维数组矩阵旋转,关键不在于背公式,而在于理解坐标变换的规律。顺时针旋转90°是最高频需求,而它的标准解法——“转置 + 水平翻转”——既直观又可靠。至于逆时针或其他角度,完全可以从这个基础上推出来,没必要死记硬背坐标映射表。
原地旋转虽然节省空间,但逻辑复杂,很容易绕进去。对于大多数业务场景,新建数组的方式更直观、更安全。推荐采用“先转置,再每行反转”的策略:
matrix[i][j] 与 matrix[j][i] 交换,也就是行列互换。需要注意,循环条件要求 i < j,避免重复交换。row.length / 2 - 1。别想着用 Arrays.sort(),那不是干这事的。举个例子:一个 3×3 矩阵,先转置变成对称形式,再反转每一行,自然就得到了顺时针旋转90°的结果。该方法的时间复杂度是 O(n²),空间上可以原地(O(1))或者新建数组(O(n²))。
那逆时针旋转呢?不需要重写一套坐标公式。虽然三次顺时针90°等价于一次逆时针90°,但那样效率太低。更优雅的做法是“转置 + 垂直翻转”,或者反过来“先垂直翻转,再转置”。推荐后者:
i 行与第 (n-1-i) 行,i 范围从 0 到 n/2 - 1。i < j。这样一来,就避免了手算新坐标时可能出现的 off-by-one 错误,也更方便单元测试验证。
矩阵旋转只在90°的整数倍时有意义,其他角度需要插值,那属于图像处理的范畴。对于输入角度比如 270°、-90°、360°,先取模归一化:
angle = ((angle % 360) + 360) % 360,将角度统一到 0°、90°、180°、270°。封装的时候,建议用 switch 语句或者查表映射,别堆叠 if-else。这样可读性和扩展性都好得多。
生产环境里,null、空数组、非矩形数组(比如 int[][] arr = {{1},{2,3}})很容易引发 ArrayIndexOutOfBoundsException 或 NullPointerException。需要警惕的是,这些看似琐碎的判断,不到十行代码,却能拦住大部分集成环境下的崩溃,比事后 debug 性价比高太多:
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)matrix[i],确认每行长度等于 matrix[0].length,不等则抛出 IllegalArgumentException。new int[matrix[0].length][matrix.length]。这些防护措施看起来基础,但在处理复杂业务逻辑时,往往是保障系统稳定性的第一道防线。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8