##题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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));
}
}
}
测试结果
123698745