剑指offer(十九)——顺时针打印矩阵

剑指offer(十九)——顺时针打印矩阵

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

题解
这种题就是我们学基本语法二维数组时遇到的类似蛇形矩阵的东西,说到底就是如何遍历数组的问题,难点在于边界的判定和移动方向的改变。

  • 我们可以知道,当matrix[i][j]到达左上角,右上角,左下角,右下角的时候就要改变方向,因此我们用四个变量来记录这些边界。
public static ArrayList<Integer> printMatrix(int [][] matrix) {
		//遍历结果存储在这个数组中
		ArrayList<Integer> resultList = new ArrayList<>();
		//边界
		int leftEdge = 0, rightEdge = matrix[0].length - 1, upEdge = 0, downEdge = matrix.length - 1;
		//matrix的大小
		int count = matrix[0].length * matrix.length;
		//方向
		int[][] dir = new int[][] {{0,1},{1,0},{0,-1},{-1,0}};
		int i = 0, j = 0, dirCount = 0, direction = 0;
		while(count != 0) {
			//当向右走并且到达边界时,改变方向和边界
			if (direction == 0 && j == rightEdge) {
				dirCount ++;
				upEdge ++;
			}
			//当向下走并且到达边界时,改变方向和边界
			if (direction == 1 && i == downEdge) {
				dirCount ++;
				rightEdge --;
			}
			//当向左走并且到达边界时,改变方向和边界
			if (direction == 2 && j == leftEdge) {
				dirCount ++;
				downEdge --;
			}
			//当上右走并且到达边界时,改变方向和边界
			if (direction == 3 && i == upEdge) {
				dirCount ++;
				leftEdge ++;
			}
			direction = dirCount % 4;
			//测试:i和j值。调试时用的
//			System.out.println(i + " " + j);
			resultList.add(matrix[i][j]);
			//移动
			i += dir[direction][0];
			j += dir[direction][1];
			count--;
		}
		return resultList;     
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章