(面試題)如何之字形打印二維數組

什麼是之字形打印二維數組:
比如給定一個二維數組

在這裏插入圖片描述
按照紅色線路打印,即稱作“之”字型打印
在這裏插入圖片描述
怎麼實現呢?想要直接尋找每個位置與位置之間的關係是很難的,所以我們需要從這個線路着手,怎麼能走出這樣的線路呢?

我們設置兩個指針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判斷即可!~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章