(面试题)如何之字形打印二维数组

什么是之字形打印二维数组:
比如给定一个二维数组

在这里插入图片描述
按照红色线路打印,即称作“之”字型打印
在这里插入图片描述
怎么实现呢?想要直接寻找每个位置与位置之间的关系是很难的,所以我们需要从这个线路着手,怎么能走出这样的线路呢?

我们设置两个指针a和b,各自的行走线路如下:

在这里插入图片描述

有什么用呢?ab总能形成一个对角线,在这里插入图片描述

形成了对角线,然后设置一个boolean类型的flag,控制打印的方向,如果flag为true,就从下往上打印,如果为false就从上往下打印
所以打印顺序就是这样:
在这里插入图片描述.看一下代码:

package Mianshi;

public class PrintZhi {

    public static void printZhi(int[][] arr){
        int aR = 0;//a的行坐标
        int aC = 0;//a的列坐标
        int bR = 0;//b的行坐标
        int bC = 0;//b的列坐标
        int endR = arr.length - 1;//b走到endR表示走完了
        int endC = arr[0].length - 1;//a走到endC表示走完了
        boolean flag = false;
        while(endR + 1 != aR){
            printTmpArrNum(arr, aR,aC,bR,bC,flag);
            aR = aC == endC ? aR + 1 : aR;//不能写aR++
            aC = aC == endC ? aC : aC + 1;
            bC = bR == endR ? bC + 1 : bC;
            bR = bR == endR ? bR : bR + 1;
            flag = !flag;
            System.out.println();
        }
    }

    private static void printTmpArrNum(int[][] arr, int aR, int aC, int bR, int bC, boolean flag) {
        if (flag){
            while (aR != bR + 1)
                System.out.print(arr[aR++][aC--]+" ");
        }else {
            while (bR != aR - 1){
                System.out.print(arr[bR--][bC++]+" ");
            }
        }
    }

    public static void main(String[] args) {
        int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
        printZhi(matrix);
    }
}

生成一个图,便于理解:
在这里插入图片描述
a,b最开始都是(0,0),(3,3)作为终止条件,如果a的行到了3,说明他执行完毕了,因为a先往右走,到了(0,3),还是第0行,然后才往下走,等行数到了3,才终止。
b是从下开始走,到了(3,0),然后右拐,直到(3,3)终止。

找到了a,b的坐标以后打印就比较简单了,只要通过boolean判断即可!~

原文地址:https://www.cnblogs.com/taobean/p/12364259.html