顺时针旋转阵列

use*_*514 10 java arrays algorithm

我有一个二维数组,我需要顺时针旋转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<arr[0].length; i++){
            for(int j=arr.length-1; j>=0; j--){
                newArray[ii][jj] = arr[i][j];

                jj++;
            }
            ii++;
        }

        return newArray;
    }
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 37

这是标准矩阵顺时针旋转代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

请注意以下几点:

  • 它提高了可读性,可以将MxN矩阵的维度称为MN
  • 使用传统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]
}
Run Code Online (Sandbox Code Playgroud)

注意使用for-each循环和java.util.Arraysin printMatrix.如果你在Java中使用大量的数组,你一定要熟悉它们.

链接到Java矩阵库

如果您经常使用矩阵,您可能需要考虑使用专门的矩阵库.

相关问题

从技术上讲,Java有阵列数组.确保您了解所有含义.


Ale*_*lli 14

我不明白你的循环的逻辑 - 不应该

   for(int i=0; i<arr[0].length; i++){
        for(int j=arr.length-1; j>=0; j--){
            newArray[i][j] = arr[j][i];
        }
    }
Run Code Online (Sandbox Code Playgroud)

是否每个指数上涨,如此i处或下跌,如此j处(以及是否需要在任务中"翻转"其中一个或两个,例如arr.length-1-j在任务的j一侧使用代替平原=;-)中,由于arr尺寸是arr.lengtharr[0].length,反之亦然为newArray,在我看来,关于第一索引arr(第二上newArray)必须是一个跨越从0至arr.length-1包括,其它范围的其他指标.

这是一种"基本尺寸分析"(除了"尺寸"用于与通常用于"尺寸分析"不同的意义上的"尺寸分析",其指的是物理尺寸,即时间,质量,长度,&c ;-)."翻转"和每个循环上升或下降的问题取决于可视化你的意思,我不是最伟大的"心理可视化器"所以我认为,在现实生活中,我会尝试各种变体"轴换位"直到我击中了那个意思;-).

  • newArray [i] [j] = arr [j] [i]; 转置矩阵.它应该是newArray [i] [length-1-j] = arr [j] [i]; (3认同)