题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
例如,如果输入如下矩阵:
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.
算法思想
先打印最上面一行,从左向右,
然后判断是否有必要从上向下打印(如果数组只有一行的话这个if语句其实就不走了),
接着判断是否有必要从右向左打印(至少两列,只有一列的时候走了前两个if之后就打印结束了),
接着判断是否有必要从下到上打印(至少三行,只有两行的时候,走了前三个if打印就结束了).
代码如下:
import java.util.*; public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { int startX = 0; int endX = matrix[0].length-1; int startY = 0; int endY = matrix.length -1; ArrayList<Integer> result = new ArrayList(); while (startX <= endX && startY <= endY) { // 从左到右 if(startX <= endX){ for (int i = startX; i <= endX; i++) { result.add(matrix[startY][i]); } } // 从上往下,此处没有=号,至少两行时 if (startY < endY) { for (int i = startY + 1; i <= endY; i++) { result.add(matrix[i][endX]); } } // 从右往左,至少两行两列 if (startX < endX && endY > startY) { for (int i = endX - 1; i >= startX; i--) { result.add(matrix[endY][i]); } } // 从下往上打印,至少三行两列 if (startY < endY-1 && endX > startX) { for (int i = endY - 1; i >= startY + 1; i--) { result.add(matrix[i][startX]); } } startX++; endX--; startY++; endY--; } return result; } }