"之"字形打印矩阵

2018-07-11  本文已影响0人  stoneyang94

题目描述

之字形打印一个矩阵

之字形

例如:

1 2 3 4
5 6 7 8
9 10 11 12

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

分析

思路

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

做法

宏观调度

设置两个点A(aR,aC),B(bR,bC)(行,列),都从0,0点开始。

二维数组

二维数组其实是由一维数组组成,比如

int[][] arr = {
        {1,2,3,4},
        {4,5,6,8}
      };

int rows = i.length;//行数
int columns = i[0].length;//列数

代码实现

public class ZigZagPrintMatrix {
    public static void zigZagPrintMatrix(int[][]matrix){
        if(matrix==null || matrix.length==0 || matrix[0].length==0){
            return ;
        }
        int aR = 0;//行
        int aC = 0;//列
        int bR = 0;//行
        int bC = 0;//列
        int endR = matrix.length-1;//行结束位置,的索引
        int endC = matrix[0].length-1;//列结束位置,的索引
        boolean fromUp = false;
        while(aR != matrix.length){//当aR到最后一行的时候 
            printMatrix(matrix, aR, aC, bR, bC, fromUp);
            aR = aC==endC ? aR+1 : aR;
            aC = aC==endC ? aC : aC+1;
            bC = bR==endR ? bC+1 : bC;
            bR = bR==endR ? bR : bR+1;
            fromUp = !fromUp;
        }
    }

    public static void printMatrix(int[][]matrix,int aR,int aC,
                                int bR,int bC,boolean fromUp){
        if(fromUp){//从右上到左下
            while(aR!= bR+1){//一行一行扫过来
                System.out.print(matrix[aR++][aC--]+" ");
            }
        }else {
            while(bR != aR-1){
                System.out.print(matrix[bR--][bC++]+" ");
            }
        }
    }
    public static void main(String[] args) {
        int matrix[][] = new int[][]{
            {1, 2, 3,  4},
            {5, 6, 7,  8},
            {9, 10,11, 12},
            {13,14,15, 16}
        };
        zigZagPrintMatrix(matrix);
    }
}
输出
上一篇下一篇

猜你喜欢

热点阅读