剑指offer面试题20-顺时针打印矩阵

题目:

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

如:

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.



一个二维数组,打印的第一轮的起点肯定是(0,0),第二轮(如果有的话)起点为(1,1)。

那第n轮肯定就是(n-1,n-1)了。

那么从(0,0)开始到多少截至呢?

比如说矩阵的列数为4,一圈减掉2个,需要走2(0,0~~1,1)次;如果列数为5,需要走3(0,0~~1,1~~2,2)次。

光看列数的话,需要满足0<2*n<colums


循环的条件应该是

2n<colums && 2n<rows

	public void print(int[][] array, int cols, int rows) {
		if (array == null || cols < 0 || rows < 0) {
			throw new RuntimeException();
		}
		int start = 0;
		while (start * 2 < cols && start * 2 < rows) {
			printMatrix(array, cols, rows, start++);
		}
	}

接着再看具体的应该怎么打印矩形:

应该是分为四步:

1.从左到右(上层)

2.从上到下(右层)

3.从右到左(下层)

4.从下到上(左层)

顺时针的话,就是这样一个顺序。。。


要注意的就是:

1.上层的从左到右的最后一个打印过了,右层的从上到下就不再打印第一个了

2.右层的从上到下打印过最后一个了,下层的从右到左也就不再打印打印第一个了

3.上层以及下层的都打印过第一个元素了,所以左层的从下到上首位都不应该打印。


还有就是如果剩下的矩阵只有一列或者一行的情况


	private void printMatrix(int[][] array, int cols, int rows, int start) {
		int endX = cols - start;
		int endY = rows - start;
		// 从左到右
		for (int i = start; i < endX; i++) {
			System.out.println(array[start][i]);
		}
		// 从上往下(右)
		if (start < endY-1) {
			for (int i = start + 1; i < endY; i++) {
				System.out.println(array[i][endX - 1]);
			}
		}

		// 从右往左(下)
		if (start < endX-1 && start < endY-1) {
			for (int i = endX - 2; i >= start; i--) {
				System.out.println(array[endY - 1][i]);
			}
		}
		// 从下往上(左)
		if (start < endX-1 && start < endY - 2) {
			for (int i = endY - 2; i >= start + 1; i--) {
				System.out.println(array[i][start]);
			}
		}

	}



你可能感兴趣的:(矩阵,顺时针打印)