题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
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.不过,最后一圈有可能会退化成只有一行,只有一列,甚至只有一个数字。因此打印也退化成了三步或两步或一步。因此打印前要分析好每一步的前提条件。
3.第一步总是需要的。第二步需要判断终止行号大于起始行号。第三步需要终止行号大于起始行号以及终止列小于起始列号。第四步需要至少有三行两列,因此要求终止行号比起始行号至少大2,同时终止行号大于起始列号。
代码:
package jzoffer;
public class E20PrintMatrix {
public void printMatrixInCircle(int[][] array){
if(array == null){
return;
}
int start = 0;
while(array[0].length > start*2 && array.length >start*2){
printOneCircle(array, start);
start++;
}
}
public E20PrintMatrix() {
}
private void printOneCircle(int[][] array,int start){
int columns = array[0].length; //列数
int rows = array.length; //行数
int endX = columns - 1 - start;
int endY = rows -1 -start;
//从左到右打印一行
for(int i =start;i<=endX;i++){
int number = array[start][i];
System.out.print(number+",");
}
//从上到下打印一列
if(start < endY){
for(int i = start+1;i<=endY;i++){
int number = array[i][endX];
System.out.print(number+",");
}
}
//从右到左打印一行
if(start <endX && start <endY){
for(int i = endX-1;i>=start;i--){
int number = array[endY][i];
System.out.print(number+",");
}
}
//从下到上打印一行
if(start<endY && start <endY -1){
for(int i = endY - 1;i>=start +1;i--){
int number = array[i][start];
System.out.print(number + ",");
}
}
}
public static void main(String[] args) {
int[][] arr = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
E20PrintMatrix test = new E20PrintMatrix();
System.out.println("我们原本的矩阵为:");
System.out.println("1 2 3 4");
System.out.println("5 6 7 8");
System.out.println("9 10 11 12");
System.out.println("顺时针打印矩阵为:");
test.printMatrixInCircle(arr);
}
}
结果如图: