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

Java实现矩阵原地转置交换matrix[i][j]与[j][i]失效问题

方阵原地转置实现失效问题排查

问题表现

尝试通过交换对称位置元素的思路实现矩阵原地(Inplace)转置,预期通过交换matrix[i][j]与matrix[j][i]的元素完成转置逻辑,但代码运行后未输出预期结果。
原有错误实现代码如下:

class Solution {
    public int[][] transpose(int[][] matrix) {
        
        
        for(int i = 0; i < matrix.length; i++){
            for(int j = 0; j < matrix[0].length; j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        
        return matrix;
    }
}

实际运行测试:输入3阶方阵[[1,2,3],[4,5,6],[7,8,9]]时,代码输出与原矩阵完全一致,未得到预期转置结果[[1,4,7],[2,5,8],[3,6,9]]。

根本原因

  • 双层循环覆盖了矩阵所有坐标点,每一对对称位置的元素会被执行两次交换操作:第一次遍历到坐标(i,j)时完成一次交换,后续循环遍历到对称坐标(j,i)时会再次交换这两个位置的元素,等于把元素换回了初始位置,最终整个矩阵没有任何变化。
  • 以坐标(0,1)和(1,0)为例:当i=0,j=1时,两个位置的元素2和4完成交换,此时这两个位置已经是转置后的正确值;但循环运行到i=1,j=0时,会再次交换这两个位置的元素,4和2回到原始位置,之前的交换操作完全失效。
  • 额外说明:原地转置逻辑仅适用于行列数相等的方阵,如果输入矩阵行列数不相等,转置后矩阵维度会发生变化,无法在原数组空间内完成原地转置。

修正方法

调整内层循环的遍历范围,只遍历矩阵主对角线单侧的三角区域元素,保证每对对称位置的元素仅被交换一次即可。
修正后的代码如下:

class Solution {
    public int[][] transpose(int[][] matrix) {
        for(int i = 0; i < matrix.length; i++){
            // j从i+1开始,仅遍历主对角线右上方的元素,避免重复交换
            for(int j = i + 1; j < matrix[0].length; j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        return matrix;
    }
}

内容的提问来源于stack exchange,提问作者Uttam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:57:26