剑指offer--算法题--21--顺时针打印矩阵

题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:

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);
	}

}

结果如图:


猜你喜欢

转载自blog.csdn.net/lsm18829224913/article/details/80518402