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] * *輸出結果:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10 * * */ /*思路:終止行號大於起始行號,終止列號大於起始列號, 考慮每一個元素在行和列中的位置變換*/ /*實現步驟: * * 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+","); } } }