【劍指Offer】二維數組——轉圈打印

package cn.dzp.flyroc.offer;

import java.util.ArrayList;

public class PrintMatrixDemo {

    /*題目描述:輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每個數字*/

    /*例如矩陣:
    *
    *      [1,2,3,4
    *      5,6,7,8
    *      9,10,11,12
    *      13,14,15,16]
    *
    *輸出結果:12348121615141395671110
    *
    * */

    /*思路:終止行號大於起始行號,終止列號大於起始列號,
    考慮每一個元素在行和列中的位置變換*/



    /*實現步驟:
    *
    * 1、定義起始行,起始列,終止行,終止列
    * 2、先判斷一行或一列狀況
    * 3、定義行和列的臨時變量
    * 四、從第一個元素開始轉圈
    *
    * */

    //代碼實現
    public static ArrayList<Integer> printMatrix(int[][] matrix){

        //new一個list
        ArrayList<Integer> list = new ArrayList<>();

        int startRow = 0;       //定義起始行爲第一行
        int startCol = 0;       //定義起始列爲第一列
        int endRow = matrix.length-1;     //定義終止行爲數組的長度-1
        int endCol = matrix[0].length-1;      //定義終止列爲數組第一行長度-1

        //判斷起始行是否始終小於終止行,起始列是否始終小於終止列
        while(startRow <= endRow && startCol <= endCol){

            if (startRow == endRow){        //判斷只有一行的狀況

                for (int i = startCol; i <= endCol; i++){

                    list.add(matrix[startRow][i]);
                }
            }else if (startCol == endCol){      //判斷只有一列的狀況

                for (int i = startRow; i <= endRow; i++){

                    list.add(matrix[i][startCol]);
                }

            }else {

                //定義行和列的臨時變量
                int tempRow = startRow;
                int tempCol = startCol;

                //從第一個元素開始轉圈

                while(tempCol < endCol){        //行數不變,列數在增長

                    list.add(matrix[startRow][tempCol]);
                    tempCol++;
                }
                while(tempRow < endRow){        //列數不變,行數在增長

                    list.add(matrix[tempRow][endCol]);
                    tempRow++;

                }
                while(tempCol > startCol){      //行數不變,列數在減少

                    list.add(matrix[endRow][tempCol]);
                    tempCol--;

                }
                while(tempRow > startRow){      //列數不變,行數在減少

                    list.add(matrix[tempRow][startCol]);
                    tempRow--;

                }
            }

            //對角線向內查找,直到找到最中間的位置
            startRow++;
            startCol++;
            endRow--;
            endCol--;

        }
        return list;
    }


    //測試方法
    public static void main(String[] args){

        int matrix[][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        ArrayList<Integer> list = printMatrix(matrix);

        System.out.print("輸出結果:");
        for (int a:list) {
            System.out.print(a+",");
        }
    }
}
相關文章
相關標籤/搜索