顺时针旋转数组

新手上路,请多包涵

我有一个二维数组,我需要顺时针旋转 90 度,但是我一直在获取 arrayindexoutofbounds…

 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;
}

原文由 user69514 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 447
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];
    }
}

每个索引是否上升,如 i 此处,或下降,如 j 此处(以及是否需要在分配中“翻转”其中一个或两个,例如使用 arr.length-1-j in lieu of plain j on one side of the = in the assignment;-), since arr dimensions are arr.length by arr[0].length , and vice versa for newArray , it seems to me that the first index on arr (second on newArray ) 必须是跨越从 0 到 arr.length-1 范围的那个,另一个范围是另一个索引。

这是一种“基本量纲分析”(除了“量纲”的使用意义与通常与“量纲分析”不同,后者指的是物理量纲,即时间、质量、长度等)。 “翻转”和让每个循环上升或下降的问题取决于对你的意思的准确形象化,我不是最伟大的“心理形象化者”所以我认为,在现实生活中,我会尝试这个“轴换位”,直到我找到那个意思;-)。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 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, 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]
}

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

Java 矩阵库的链接

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

相关问题

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

原文由 polygenelubricants 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏