1. 程式人生 > 其它 >程式設計師面試金典-1.7 旋轉矩陣。給定一幅由 N ×N 矩陣表示的影象,其中每個畫素的大小為 4 位元組,編寫 一種方法,將影象旋轉 90 度。不佔用額外記憶體空間能否做到?

程式設計師面試金典-1.7 旋轉矩陣。給定一幅由 N ×N 矩陣表示的影象,其中每個畫素的大小為 4 位元組,編寫 一種方法,將影象旋轉 90 度。不佔用額外記憶體空間能否做到?

圖解:

程式碼解決:


public class RotateTest {
    public static void main(String[] args) {
        Integer[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};

        System.out.println("旋轉前陣列:");
        for (int i = 0; i < matrix.length; i++) {
            System.out.println(Arrays.toString(matrix[i]));
        }
        boolean result = rotate(matrix);
        System.out.println("是否可以旋轉:" + result);
        if (result) {
            System.out.println("選擇後陣列:");
            for (int i = 0; i < matrix.length; i++) {
                System.out.println(Arrays.toString(matrix[i]));
            }
        }
    }
        private static boolean rotate(Integer[][] matrix) {
        // 判斷是否為正方矩形
        int len = matrix.length;
        int el = 2;
        if (len == 0) {
            return false;
        }
        for (int i = 0; i < len; i++) {
            if (len != matrix[i].length) {
                System.out.println(i);
                return false;
            }
        }
        for (int layer = 0; layer < len / el; layer++) {
            int first = layer;
            int last = len -1 - layer;
            for (int j = first; j < last; j++) {
                int offset = j -first;
                // 儲存上邊
                int top = matrix[first][j];
                // 左邊移動到上邊
                matrix[first][j] = matrix[last - offset][first];
                // 下邊移動到左邊
                matrix[last - offset][first] = matrix[last][last - offset];
                // 右邊移動到下邊
                matrix[last][last - offset] = matrix[j][last];
                // 上邊移動到右邊
                matrix[j][last] = top;
            }
        }
        return true;
    }
}