顺时针旋转阵列

2022-09-04 05:03:37

我有一个二维数组,我需要顺时针旋转90度,但是我不断得到数组索引出界...

public int[][] rotateArray(int[][] arr) {
    // first change the dimensions vertical length
    // for horizontal length and vice versa
    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;
}

答案 1

下面是一个标准矩阵顺时针旋转代码:

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 矩阵的维度称为 和 的可读性MN
  • 传统上是使用而不是索引矩阵的行和列r, ci, j
  • 这不是最可靠的实现:
    • 不确保这是有效的 MxN 矩阵,matM>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]
}

请注意 for-each 循环和 java.util.Arrays 在 中的用法。如果你在Java中经常使用数组,你绝对应该熟悉它们。printMatrix

指向 Java 矩阵库的链接

如果您经常使用矩阵,则可能需要考虑改用专用矩阵库。

相关问题

从技术上讲,Java具有数组数组。确保您了解所有含义。


答案 2

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

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

Net 的 Net 是每个索引都上升,就像这里一样,还是像这里一样下降(以及赋值中是否需要“翻转”其中任何一个或两个索引,例如在赋值的一侧使用代替普通索引;-),由于维度是 by ,反之亦然,在我看来,第一个索引 on (second on) 必须是跨越范围从 0 到包含的索引, 和另一个索引的其他范围。ijarr.length-1-jj=arrarr.lengtharr[0].lengthnewArrayarrnewArrayarr.length-1

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