矩阵的旋转
一,给定一个矩阵,用二维数组表示,不一定是方阵(N*N),求矩阵的转置(向右),和向左转置。比如:
1 2 3
4 5 6
7 8 9
向右转置:
1 4 7
2 5 8
3 6 9
再比如:
1 2 3
4 5 6
向 左转置
3 6
2 5
1 4
二,实现思路
假设原来的矩阵是M*N,转置后变成了 N*M。设原矩阵是arr[M][N],创建一个新的矩阵 rev[N][M]
对于向右转置而言,就是线性代数里面的求AT,对于arr[M][N]里面的每个元素arr[i][j],将之赋值给 rev[j][i] 即可。
对于向左转置,对于arr[M][N]里面的每个元素arr[i][j],将之赋值给 rev[N-j-1][i] 即可。
三,完整代码
public class Test{ public static void main(String[] args) { int[][] arr1 = {{1,2,3},{4,5,6},{7,8,9}}; int[][] arr2 = {{1,2,3},{4,5,6}}; reverseRight(arr1); System.out.println("---------"); reverseRight(arr2); System.out.println("***********"); reverseLeft(arr1); System.out.println("-------------"); reverseLeft(arr2); } public static void reverseRight(int[][] arr){ int row = arr.length; int col = arr[0].length; int[][] rev = new int[col][row]; for(int i = 0; i < row; i++) { for(int j = 0; j < col; j++) rev[j][i] = arr[i][j]; } StringBuilder sb = new StringBuilder(); //打印旋转后的矩阵--有col行和 row 列 for(int i = 0; i < col; i++) { for(int j = 0; j < row; j++) { //System.out.print(rev[i][j]+" "); sb.append(rev[i][j] + " "); } sb.deleteCharAt(sb.length()-1); sb.append("\n"); // System.out.println(); } System.out.println(sb.toString()); } public static void reverseLeft(int[][] arr) { int row = arr.length; int col = arr[0].length; int[][] rev = new int[col][row]; for(int i = 0; i < row; i++) { for(int j = 0; j < col; j++) { rev[col-j-1][i] = arr[i][j]; } } //打印旋转后的矩阵--有col行和 row 列 for(int i = 0; i < col; i++) { for(int j = 0; j < row; j++) { System.out.print(rev[i][j] + " "); } System.out.println(); } } }