如何编写实现二维数组行列互换的Java方法 现有代码报错如何解决
代码错误列表
- 类修饰符非法:Java顶层类不允许使用static修饰,只有静态内部类才能添加static修饰符,当前代码直接编译不通过。
- 类命名不符合规范:Java类名要求使用大驼峰形式,首字母需大写,不应使用小写开头的
inverse作为类名。 - 数组初始化逻辑错误:直接硬编码创建3*3的新数组,仅能处理固定大小的方阵,不满足接收任意整数二维数组的需求;且初始化后没有将传入的原数组
A的内容写入新数组,全程操作的都是全0值的空数组,完全没有用到入参。 - 循环逻辑完全错误:循环边界设置为数组长度的1/2,仅能遍历数组前1/4的区域,且逻辑是数组反转的错误思路,和转置(行列互换)的需求完全不匹配。
- 赋值类型不匹配:代码中
B[B.length - i - 1]是一维数组类型,直接给它赋值int类型的swap变量,类型不兼容,编译报错。 - 返回值错误:
swap是第二层for循环内的局部变量,超出作用域后无法访问;且方法要求返回int[][]类型的二维数组,swap是int类型,类型不匹配,编译报错。
正确实现思路与代码
转置的核心逻辑是将原数组第i行第j列的元素,放到新数组的第j行第i列位置。首先要根据传入的原数组的行列数动态初始化转置数组,保证支持所有规则二维数组的转置需求:
public class Inverse { public static int[][] arrayInverse(int[][] A) { // 非空校验,避免空指针异常 if (A == null || A.length == 0 || A[0].length == 0) { return new int[0][0]; } // 原数组的行、列数 int originalRow = A.length; int originalCol = A[0].length; // 转置后数组行列互换 int[][] transposedArr = new int[originalCol][originalRow]; // 遍历原数组完成转置赋值 for (int i = 0; i < originalRow; i++) { for (int j = 0; j < originalCol; j++) { transposedArr[j][i] = A[i][j]; } } return transposedArr; } }
如果是需要原地转置方阵(行数等于列数的二维数组),可以用元素交换的方式节省内存,无需创建新数组,实现逻辑如下:
public static void squareArrayInverse(int[][] A) { if (A == null || A.length == 0 || A.length != A[0].length) { return; } int n = A.length; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { int temp = A[i][j]; A[i][j] = A[j][i]; A[j][i] = temp; } } }
内容的提问来源于stack exchange,提问作者Pristige Beetle
相关产品推荐
相关产品推荐

