文章目錄
- 題目
- 分析
- 代碼
題目
輸入一個矩陣,按照從外向里以順時針的順序依次列印出每一個數字,例如,如果輸入如下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.
分析
定義四個變數分別代表矩陣的四條邊:top,right,down,left
- 向右走存入整行的值,當存入后,該行再也不會被遍歷,代表上邊界的 top++,同時判斷是否和代表下邊界的 down 交錯
- 向下走存入整列的值,當存入后,該列再也不會被遍歷,代表右邊界的 right–,同時判斷是否和代表左邊界的 left 交錯
- 向左走存入整行的值,當存入后,該行再也不會被遍歷,代表下邊界的 down–,同時判斷是否和代表上邊界的 top 交錯
- 向上走存入整列的值,當存入后,該列再也不會被遍歷,代表左邊界的 left++,同時判斷是否和代表右邊界的 right 交錯

代碼
public ArrayList<Integer> printMatrix(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
if (matrix == null || matrix.length == 0) return list;
//定義四個變數
int top = 0, dowm = matrix.length - 1, left = 0, right = matrix[0].length - 1;
while (true) {
//先對頂行進行處理
for (int i = left; i <= right; i++) {
list.add(matrix[top][i]);
}
top++;//將top向下移動
//判斷底層和上層是否已經交錯
if (top > dowm) break;
//再對右邊一列進行處理
for (int i = top; i <= dowm; i++) {
list.add(matrix[i][right]);
}
right--;//右邊指標向左移動
//判斷左邊和右邊是否已經交錯
if (left > right) break;
//再對down處理=>從右往左進行遍歷
for (int i = right; i >= left; i--) {
list.add(matrix[dowm][i]);
}
dowm--;//底層向上移動
if (top > dowm) break;
//最后對左邊進行遍歷=>從下往上遍歷
for (int i = dowm; i >= top; i--) {
list.add(matrix[i][left]);
}
left++;//向右移動
if (left > right) break;
}
return list;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/253520.html
標籤:其他
上一篇:Filter-Policy
