在Java中旋转NxN矩阵

这是打破编码面试的一个问题。该解决方案说,该程序旋转外部边缘,然后内部边缘。但是,我无法遵循for循环的逻辑。

有人可以解释代码的逻辑(例如为什么他们做“层”n / 2“,”左“>”顶“和”底“左)的四个步骤等)?在附注中,在编码面试中,在思考过程中会怎样呢?

Given an image represented by an NxN matrix, where each pixel in the
image is 4 bytes, write a method to rotate the image by 90 degrees.
Can you do this in place?

public static void rotate(int[][] matrix, int n) {
    for (int layer = 0; layer < n / 2; ++layer) {
        int first = layer;
        int last = n - 1 - layer;
        for(int i = first; i < last; ++i) {
            int offset = i - first;
            int top = matrix[first][i]; // save top

            // left -> top
            matrix[first][i] = matrix[last-offset][first];          

            // bottom -> left
            matrix[last-offset][first] = matrix[last][last - offset]; 

            // right -> bottom
            matrix[last][last - offset] = matrix[i][last]; 

            // top -> right
            matrix[i][last] = top; // right <- saved top
        }
    }
}
概观

考虑一个样本矩阵可能如下所示:

ABCD
EFGH
IJKL
MNOP

为了我的解释,ABCD被认为是行0,EFGH是第1行,依此类推。行0的第一个像素是A.

另外,当我谈到外壳时,我指的是:

ABCD
E  H
I  L
MNOP

首先我们来看看移动值的代码。

    int top = matrix[first][i]; // save top

第一行将值缓存在顶部位置。这是指由[first] [i]确定的矩阵的顶行上的位置。例如:保存A.

    // left -> top
    matrix[first][i] = matrix[last-offset][first];          

下一部分将值从左侧位置移动到顶部位置。例如:把M放在A的位置。

    // bottom -> left
    matrix[last-offset][first] = matrix[last][last - offset]; 

下一部分将值从底部位置移动到左侧位置。例如:拿P并把它放在M的地方。

    // right -> bottom
    matrix[last][last - offset] = matrix[i][last]; 

下一个部分将值从正确位置移动到底部位置。例如:拿D并把它放在P所在的位置。

    // top -> right
    matrix[i][last] = top; // right <- saved top

最后一部分将缓存中的值(顶部位置)移动到正确的位置。例如:把A从D的第一步。

接下来的循环。

外部循环从行0到总行数的一半。这是因为当您旋转第0行时,它也会旋转最后一行,当您旋转第1行时,它也会旋转第二行到最后一行,依此类推。

内循环从行中的第一个像素位置(或列)运行到最后一个。请记住,对于行0,这是从像素0到最后一个像素,但对于行1,这是从像素1到第二个到最后一个像素,因为第一个和最后一个像素作为行0的一部分旋转。

所以外圈的第一次迭代使得外壳旋转。换一种说法:

ABCD
EFGH
IJKL
MNOP

变为:

MIEA
NFGB
OJKC
PLHD

看看外壳是如何顺时针旋转的,但内芯没有移动。

然后外循环的第二次迭代导致第二行旋转(不包括第一个和最后一个像素),我们最终得到:

MIEA
NJFB
OKGC
PLHD
翻译自:https://stackoverflow.com/questions/25882480/rotating-a-nxn-matrix-in-java

转载注明原文:在Java中旋转NxN矩阵