“之”字形打印矩阵

引用

    给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵。例如

    1,8,6,7

    2,6,4,11

    3,5,9,10

    打印结果是1,8,2,3,6,6,7,4,5,9,11,10。要求额外空间复杂度是O(1)。

思路

    两个坐标进行记录,都从0,0点开始。一个往右移动,移动到最右往下移动;另一个往下移动,移动到最下往右移动,两个坐标始终处于一条斜线,然后打印斜线上的元素就行。

代码

public class ZigZagPrintMatrix {

    // row1 col1往右走 走到头往下走
    // row2 col2往下走 走到头往右走
    // 始终处于一条斜线 打印斜线上的元素
    public static void printMatrixZigZag(int[][] matrix){
        // 都是从0,0 位置开始
        int row1 =0;
        int col1 = 0;
        int row2 = 0;
        int col2 = 0;
        // 记录行边界
        int endR = matrix.length-1;
        // 记录列边界
        int endC = matrix[0].length-1;
        // 判断打印方向
        boolean fromUp = false;
        // row1越界停止,或者col2越界停止
        while (row1 != endR+1) {
            printLevel(matrix, row1, col1, row2, col2, fromUp);
            // row1 开始不变,col1走的最后 开始增加 row1开始不变
            row1 = col1 == endC ? row1 + 1: row1;
            col1 = col1 == endC ? col1 : col1+ 1;
            // col2开始不变, row2开始增加, row2走到最后开始不变, col2开始增加
            row2 = row2 == endR ? row2 : row2 + 1 ;
            col2 = row2 == endR ? col2 + 1 : col2;
            fromUp = !fromUp;
        }
        System.out.println();
    }

    /**
     * 斜线打印
     * @param matrix 矩阵数组
     * @param row1 左上左行数
     * @param col1 左上左列数
     * @param row2 左下行数
     * @param col2 左下列数
     * @param fromUp 判断打印方向
     */
    public static void printLevel(int[][] matrix, int row1, int col1, int row2,int col2, boolean fromUp){
        if(fromUp) {
            // 右上往坐下打印 一条斜线
            while (row1 <= row2){
                System.out.print(matrix[row1++][col1--] + "");
            }
        } else {
            // 左下往右上打印 一条斜线
            while (row2 <= row1) {
                System.out.print(matrix[row2--][col2++] + "");
            }
        }
    }


}

通过两个左边不断的移动,始终打印一条直线上的元素,就可以实现之字形打印。

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/whm114336793/article/details/79874432
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞