面试题29 顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
题解
根据题目,首先顺时针打印矩阵,先从左到右,再从上到下,然后从右到左,最后从下到上。设置了upLeft、upRight、downRight和downLeft来一步步地缩小打印的范围。
代码
class Solution {
public int[] spiralOrder (int[][] matrix) {
int downRight = matrix.length;//存放列的长度,右下角
if(downRight == 0) {//如果输入的矩阵为空,则返回一个空数组
return new int[0];
}
int upRight = matrix[0].length; //存放行的长度,右上角
int downLeft = 0; //左下角
int upLeft = 0; //左上角
int sumNum = upRight * downRight;//数组的元素个数
int[] arr = new int[sumNum];//创建长度为sunNum的数组
int row = 0;
int column = 0;
int i = 0;
while(true) {
//先横着走
while(column < upRight) {
arr[i] = matrix[row][column];
column ++;
i++;
}
upRight --;
column--;//防止溢出
row++;//防止重复
if(i == sumNum) {
break;
}
//再竖着走
while(row < downRight) {
arr[i] = matrix[row][column];
row ++;
i++;
}
downRight --;
row --;//防止溢出, row每次都超过1,都会溢出
column --;//防止重复
if(i == sumNum) {
break;
}
//再横着走
while(column >= downLeft) {
arr[i] = matrix[row][column];
column --;
i ++;
}
downLeft ++;
column ++;//防止溢出
row --; //防止重复, row=1
if(i == sumNum) {
break;
}
//再竖着走
while(row > upLeft) {
arr[i] = matrix[row][column];
row --;
i++;
}
upLeft ++;
row ++;//防止溢出
column++;//防止重复
if(i == sumNum) {
break;
}
}
return arr;
}
}