##题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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,每圈的四行打印的边界条件是什么
##代码实现
/** * */ package 数组; import java.util.ArrayList; /** * <p> * Title:PrintMatrix * </p> * <p> * Description: * </p> * * @author 田茂林 * @data 2017年8月25日 下午2:54:00 */ public class PrintMatrix { /** * * 循环打印结束条件:当行长度不再大于2倍的左上角列的位置,列的长度不再大于2倍的左上角行的位置 * * @param args */ public ArrayList<Integer> printMatrix(int[][] matrix) { ArrayList<Integer> list = new ArrayList<Integer>(); if (matrix == null || matrix.length < 1 || matrix[0].length < 1) { return list; } int rows = matrix.length; int cols = matrix[0].length; int start = 0; while (cols > 2 * start && rows > 2 * start) { helper(matrix, rows, cols, list, start); start++; } return list; } public void helper(int[][] matrix, int rows, int cols, ArrayList<Integer> list, int start) { int endX = cols - start - 1; // 列号结束的地方 int endY = rows - start - 1; // 行标号结束的地方 // 从左到右打印一行 for (int i = start; i <= endX; i++) { list.add(matrix[start][i]); } // 从上到下打印一列,只有终止行号大于起始行号才可以 if (endY > start) { for (int i = start + 1; i <= endY; i++) { list.add(matrix[i][endX]); } } // 从右到左打印一行,只有终止行号大于起始行号且终止列号大于起始列号才可以 if (endY > start && endX > start) { for (int i = endX - 1; i >= start; i--) { list.add(matrix[endY][i]); } } // 从下到上打印一行,终止列号大于起始列号,终止行号大于起始行号+1才行 if (endY - 1 > start && endX > start) { for (int i = endY - 1; i > start; i--) { list.add(matrix[i][start]); } } } public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); int[][] matrix = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; PrintMatrix p = new PrintMatrix(); list = p.printMatrix(matrix); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i)); } } }