二维数组转置遇数组越界问题:方阵正常非方阵报错(初学者求助)
问题分析
- 转置数组初始化错误:原数组是
r行c列,转置后的数组应该是c行r列,但你写成了long transpose[][] = new long [r][c];,当r≠c时,必然触发数组越界。 - 转置赋值逻辑错误:你用
transpose[i][j] = a[j][i]的写法,只适用于方阵的原地转置,非方阵转置需要将原数组的a[i][j]映射到转置数组的transpose[j][i]位置。 - 冗余元素交换:代码里的
temp交换完全没必要,转置不需要修改原数组,仅需将原数组元素映射到新数组即可。
修正后的代码
import java.util.Scanner; public class Transpose { public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.print("enter rows and cols: "); int r = sc.nextInt(); int c = sc.nextInt(); long a[][] = new long[r][c]; // 转置数组改为c行r列,匹配转置后的维度 long transpose[][] = new long[c][r]; System.out.print("enter " + r*c + " elements: "); for(int i = 0; i < r; i++){ for(int j = 0; j < c; j++){ a[i][j] = sc.nextLong(); } } // 打印原数组 System.out.println("\nOriginal Array:"); for(int i = 0; i < r; i++){ for(int j = 0; j < c; j++){ System.out.print(" " + a[i][j] + " "); } System.out.println(); } // 执行转置逻辑 for(int i = 0; i < r; i++){ for(int j = 0; j < c; j++){ // 原数组a[i][j]对应转置数组的transpose[j][i] transpose[j][i] = a[i][j]; } } // 打印转置数组 System.out.println("\nTransposed Array:"); for(int i = 0; i < c; i++){ for(int j = 0; j < r; j++){ System.out.print(" " + transpose[i][j] + " "); } System.out.println(); } sc.close(); } }
关键修改点说明
- 转置数组维度:将
transpose数组的维度从[r][c]改为[c][r],匹配转置后数组的行列数。 - 赋值逻辑调整:把
transpose[i][j] = a[j][i]改为transpose[j][i] = a[i][j],正确映射原数组元素到转置数组的对应位置。 - 循环范围修正:打印转置数组时,循环次数改为遍历转置数组的行(
c次)和列(r次)。 - 移除冗余交换:删掉了不必要的
temp交换代码,避免修改原数组且简化逻辑。 - 细节优化:添加了数组打印的标题提示,使用
nextLong()替代nextInt()(匹配数组long类型),最后关闭Scanner资源。
内容的提问来源于stack exchange,提问作者akshay patel
相关产品推荐
相关产品推荐

