顺时针旋转arrays
我有一个二维数组,我需要顺时针旋转90度,但我不断得到arrayindexoutofbounds …
public int[][] rorateArray(int[][] arr){ //first change the dimensions vertical length for horizontal length //and viceversa int[][] newArray = new int[arr[0].length][arr.length]; //invert values 90 degrees clockwise by starting from button of //array to top and from left to right int ii = 0; int jj = 0; for(int i=0; i=0; j--){ newArray[ii][jj] = arr[i][j]; jj++; } ii++; } return newArray; }
我不明白你的循环的逻辑 – 不应该
for(int i=0; i=0; j--){ newArray[i][j] = arr[j][i]; } }
关于每个索引是否上升的网络,比如i
在这里,或者像这里的j
一样下降(以及是否需要在赋值中“翻转”其中一个或两个,例如使用arr.length-1-j
代替普通j
在赋值中的=
一侧;-),因为arr
arr[0].length
arr.length
arr[0].length
arr.length
是arr[0].length
arr.length
,反之亦然,对于newArray
,在我看来, arr
上的第一个索引( newArray
上的第二个)必须是包含0到arr.length-1
范围的那个,另一个范围是另一个索引。
这是一种“基本的尺寸分析”(除了“尺寸”在不同的意义上使用,而不是通常与“尺寸分析”一起使用,“尺寸分析”是指物理尺寸,即时间,质量,长度,&c ;-)。 “翻转”和每个循环上升或下降的问题取决于可视化你的意思,我不是最伟大的“心理可视化器”所以我认为,在现实生活中,我会尝试各种变体“轴换位“直到我击中了那个意思;-)。
这是标准矩阵顺时针旋转代码:
static int[][] rotateCW(int[][] mat) { final int M = mat.length; final int N = mat[0].length; int[][] ret = new int[N][M]; for (int r = 0; r < M; r++) { for (int c = 0; c < N; c++) { ret[c][M-1-r] = mat[r][c]; } } return ret; }
请注意以下几点:
- 它提高了将MxN矩阵的维度称为
M
和N
可读性 - 传统上使用
r, c
而不是i, j
来索引矩阵的行和列 - 这不是最强大的实现:
- 不确保
mat
是有效的MxN矩阵,M>0, N>0
- 不确保
- 使用显式映射公式而不是无关的局部变量
- 使程序更简单,更易读
这是一个测试工具:
import java.util.Arrays; //... static void printMatrix(int[][] mat) { System.out.println("Matrix = "); for (int[] row : mat) { System.out.println(Arrays.toString(row)); } } public static void main(String[] args){ int[][] mat = { { 1, 2, 3 }, { 4, 5, 6 } }; printMatrix(mat); // Matrix = // [1, 2, 3] // [4, 5, 6] int[][] matCW = rotateCW(mat); printMatrix(matCW); // Matrix = // [4, 1] // [5, 2] // [6, 3] }
请注意在printMatrix
使用for-each循环和java.util.Arrays
。 如果你在Java中使用大量的数组,你一定要熟悉它们。
链接到Java矩阵库
如果您经常使用矩阵,您可能需要考虑使用专门的矩阵库。
- JAMA: http : //math.nist.gov/javanumerics/jama/
- UJMP: http ://www.ujmp.org/
相关问题
从技术上讲,Java有arrays数组。 确保您了解所有含义。
- 数组数组与多维数组的性能比较
- Java
Arrays.equals()
为二维数组返回false
。
jj ++运行i * j次,这一点都不好。
尝试在外部循环中重置jj。
static int[][] rotateClockwise(int[][] matrix){ int rowNum = matrix.length; int colNum = matrix[0].length; int[][] temp = new int[rowNum][colNum]; for(int i =0; i
通用对象的解决方案:
public static T[][] rotateArray90clockwise(Class clas, T[][] array){ T[][] target = (T[][])java.lang.reflect.Array.newInstance(clas, array[0].length, array.length); for (int i = 0; i < target.length; i++) { for (int j = 0; j < target[i].length; j++) { target[i][j] = array[(target[i].length - 1) - j][i]; } } return target; }
用法:
rotateArray90clockwise(Some.class,array);
*顺时针旋转矩阵或逆时针旋转矩阵的步骤
1.取得给定矩阵的转置2.垂直交换列(如果想要顺时针旋转)(或)
交换列水平(如果您想要逆时针旋转)*
顺时针旋转程序
//Program For Clockwise Rotation import java.util.Scanner; public class ClockWiseRotation { public static void main(String[] args) { int i,j,sw,n=4; int a[][]=new int[6][6]; int b[][]=new int[6][6]; System.out.println("Enter the elements for matrix\n"); Scanner input = new Scanner(System.in); for(i=0;i
逆时针旋转程序
//Anti-Clockwise Rotation import java.util.Scanner; public class Anti_ClockWiseRotation { public static void main(String[] args) { int i,j,sw,n=6; int a[][]=new int[6][6]; int b[][]=new int[6][6]; System.out.println("Enter the elements for matrix\n"); Scanner input = new Scanner(System.in); for(i=0;i
n =行数或列数
我们可以在哪里更改n,以上内容仅适用于方形矩阵
经过测试和工作得很好
public class RotateMatrix { static int index_of_rows; static int index_of_columns; static int number_of_rows; static int number_of_columns; public static void main(String[] args) { int[][] matrix={{1 ,2 ,3 ,4 ,5 }, {6 ,7 ,8 ,9 ,10}, {11,12,13,14,15}, {16,17,18,19,20}, {21,22,23,24,25}}; index_of_rows = matrix.length -1; index_of_columns = matrix[0].length -1; number_of_rows = matrix.length; number_of_columns = matrix[0].length; RotateMatrix rm = new RotateMatrix(); rm.printGrid(matrix);//before rotation rm.rotate360CW(matrix,rm); } public int[][] rotate90CW(int[][] matrix, RotateMatrix rm) { int[][] newMatrix = new int[number_of_rows][number_of_columns]; int totalNumber = (number_of_rows) * (number_of_columns); int[] intArray = createSingleArray(matrix,totalNumber); int a =0; // kept index from out-of-bounds error; mod to: // number_of_columns-1 // number_of_rows-1 for(int c=number_of_columns-1; c>=0; c--) { for(int r=0; r<=number_of_rows-1; r++) { newMatrix[r][c] = intArray[a]; a++; } } rm.printGrid(newMatrix); return newMatrix; } public int[] createSingleArray(int[][] matrix, int totalNumber) { int a=0; int[] intArray = new int[totalNumber]; for(int b=0;b<=index_of_rows; b++) { for(int c=0; c<=index_of_columns;c++) { intArray[a] = matrix[b][c]; a++; } } return intArray; } public void printGrid(int[][] matrix) { StringBuilder sb = new StringBuilder("--------------------------"); for(int i =0; i<=index_of_rows; i++) { System.out.println(sb.toString());//print each row sb.delete(0, sb.length());//Then clear the row and build the next for(int j=0; j<=index_of_columns;j++) { sb.append(matrix[i][j]+","); } } System.out.println(sb.toString()); } public int[][] rotate180CW(int[][] matrix, RotateMatrix rm) { return rm.rotate90CW(rm.rotate90CW(matrix, rm), rm); } public int[][] rotate270CW(int[][] matrix, RotateMatrix rm) { return rm.rotate90CW(rm.rotate90CW(rm.rotate90CW(matrix, rm), rm),rm); } public int[][] rotate360CW(int[][] matrix, RotateMatrix rm) { return rm.rotate90CW(rm.rotate90CW(rm.rotate90CW(rm.rotate90CW(matrix, rm), rm),rm),rm); } }
我完全明白这个问题与Swift无关,但这里有一些冗长的Swift 4:
func clockwise(num:Int, square:[[Int]]) -> [[Int]] { var s = square if num == 0 { return s } for x in 0...(square.count - 1) { for y in 0...(square.count - 1) { s[x][y] = square[(square.count - 1) - y][x] } } return clockwise(num: num - 1, square: s) } func counterClockwise(num:Int, square:[[Int]]) -> [[Int]] { var s = square if num == 0 { return s } for x in 0...(square.count - 1) { for y in 0...(square.count - 1) { s[x][y] = square[y][(square.count - 1) - x] } } return counterClockwise(num: num - 1, square: s) }
当我在Swift中搜索问题时,此线程或任何弹出的内容。
public class Sample { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int mat[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }; printMatrix(mat); int antiClockwiseMatrix[][] = rotateAntiClockwiseMatrix(mat); printMatrix(antiClockwiseMatrix); int clockwiseMatrix[][] = rotateClockwiseMatrix(mat); printMatrix(clockwiseMatrix); // rotateAntiMatrix(mat); } public static void printMatrix(int mat[][]) { for (int i = 0; i < mat.length; i++) { for (int j = 0; j < mat[0].length; j++) { System.out.print(mat[i][j] + "\t"); } System.out.print("\n"); } System.out.print("\n"); } static public int[][] rotateAntiClockwiseMatrix(int mat[][]) { int rows = mat.length; int cols = mat[0].length; int newMat[][] = new int[cols][rows]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { newMat[j][i] = mat[i][j]; } } return newMat; } static public int[][] rotateClockwiseMatrix(int mat[][]) { int newMat[][] = rotateAntiClockwiseMatrix(mat); int finMat[][] = new int[newMat.length][newMat[0].length]; for (int i = 0; i < newMat.length; i++) { int n = 0; for (int j = newMat[0].length - 1; j >= 0; j--) { finMat[i][n] = newMat[i][j]; n++; } } return finMat; } }