矩阵奇数行反转功能异常:代码执行后矩阵无变化
矩阵奇数行反转问题修复
你的代码存在三个核心问题,导致矩阵无变化:
整行遍历引发重复交换
内层循环遍历了当前行的所有列,比如一行有4个元素时,j从0到3:- j=0:交换索引0和3的元素
- j=1:交换索引1和2的元素
- j=2:又交换索引2和1的元素(把之前的交换还原)
- j=3:又交换索引3和0的元素(再次还原)
最终整行等于没修改。
列索引计算错误
你用matrix.length(矩阵的总行数)来计算列的位置,这是错误的,应该用当前行的列数matrix[i].length,否则非方阵会出现数组越界或索引错位。未正确使用辅助矩阵
代码里的matrixHelper只是单个临时变量,不是你说的辅助矩阵。如果要通过辅助矩阵取值,需要先完整复制原行数据。
修复方案1:直接在原矩阵上正确交换(无需辅助矩阵)
只遍历行的前半部分,避免重复交换:
public void horizontalReverse() { // 遍历奇数行(注意:这里i从1开始对应第2行,若需求是第1、3...行,需改为i=0开始,步长2) for (int i = 1; i < matrix.length; i += 2) { int rowLength = matrix[i].length; // 只遍历前半部分元素,和后半部分对应位置交换 for (int j = 0; j < rowLength / 2; j++) { int temp = matrix[i][j]; matrix[i][j] = matrix[i][rowLength - 1 - j]; matrix[i][rowLength - 1 - j] = temp; } } }
修复方案2:使用辅助数组实现(逻辑更直观)
先把原行数据复制到辅助数组,再反向赋值回原矩阵,避免原数组修改影响取值:
public void horizontalReverse() { for (int i = 1; i < matrix.length; i += 2) { int rowLength = matrix[i].length; int[] helperRow = new int[rowLength]; // 复制原行数据到辅助数组 System.arraycopy(matrix[i], 0, helperRow, 0, rowLength); // 从辅助数组反向赋值回原行 for (int j = 0; j < rowLength; j++) { matrix[i][j] = helperRow[rowLength - 1 - j]; } } }
内容的提问来源于stack exchange,提问作者Aida
相关产品推荐
相关产品推荐

