劍指offer之順序打印數組

算法的要求為:

輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 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.

解題的思路為:

要求順時針打印矩陣,打印的順序為

  • 頂部一行(從左到右)
  • 右側一列(從上到下)
  • 底部一行(從右到左)
  • 左側一行(從下到上)
    具體的打印矩陣的順序為如下圖所示:

遇到的問題

我之前在寫這個算法的過程中遇到了無法完整打印矩陣與數組指針越界的問題,我在仔細思考過後,發現時沒有正確的處理在while循環過程中的跳出操作。
其實應該在每一個for循環過後都要進行判斷,判斷left>right或者up>down,如果為true,則說明矩陣已經打印完成,應該跳出while循環。

代碼的實現

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       ArrayList<Integer> arr = new ArrayList<>();
        if(matrix.length == 0 || matrix == null || matrix[0].length == 0) return arr;
        int up = 0, left = 0;
        int right = matrix[0].length-1, down=matrix.length-1;
        while(true){
            // 最上面的一行代碼進行遍歷
            for(int i=left; i<=right; i++){
                arr.add(matrix[up][i]);
            }
            up ++;
            if(up > down) break;
            
            //遍歷最左邊的一列
            for(int i=up; i<=down; i++){
                arr.add(matrix[i][right]);
            }
            right --;
            if(left > right) break;
            
            //遍歷最底部一行
            for(int i=right; i>= left; i--){
                arr.add(matrix[down][i]);
            }
            down --;
            if(up >down) break;
            
            //遍歷最左側一列
            for(int i=down; i>= up; i--){
                arr.add(matrix[i][left]);
            }
            left ++;
            if(left > right) break;
        }
        
        return arr;
    }
    
}