题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
解题思路
这题比较简单, 唯一复杂的是需要自己去归纳总结,这里的主要逻辑如下, 首先我们需要4个变量去移动第一个是rowIndex也就是上下移动的下标, colIndex左右移动的下标,然后每个下标有其界限即rowEndIndex和colEndIndex,然后我们按照题目来总结了4个方向去顺序读取二维数组, 首先rowIndex和colIndex的初始都是0开始, 用r和c表示,界限用R和C表示, 所以第一行就是rc(00) -> rC(0C) ,下一个需要将r+1, 旁边的则是(r+1)C -> RC, 然后C-1开始, R(C-1) -> Rc(R0), 然后从R-1开始, (R-1)c -> rc(1,1) 然后需要进入内圈,所以这里需要c+1, 这就是一个循环过程, 然后无限循环到r>R或者c>C退出循环,一维数组的容量是可以按照两位数组计算出来的, 具体代码如下。
Java代码实现
public class SpiralOrder {
public int[] spiralOrder(int[][] matrix) {
if ( matrix.length == 0 ) {
return new int[0];
}
int rowEndIndex = matrix.length -1 ;
int colEndIndex = matrix[0].length - 1 ;
int rowIndex = 0;
int colIndex = 0;
int[] res = new int[(rowEndIndex+1) * (colEndIndex+1)];
int resIndex = 0;
while(rowIndex <= rowEndIndex && colIndex <= colEndIndex){
for (int i = rowIndex; i <= colEndIndex; i++) {
res[resIndex] = matrix[rowIndex][i];
resIndex++;
}
rowIndex += 1;
if(rowIndex > rowEndIndex){
break;
}
for (int i = rowIndex; i <= rowEndIndex; i++) {
res[resIndex] = matrix[i][colEndIndex];
resIndex++;
}
colEndIndex -= 1;
if(colIndex > colEndIndex){
break;
}
for (int i = colEndIndex; i >= colIndex; i--) {
res[resIndex] = matrix[rowEndIndex][i];
resIndex++;
}
rowEndIndex -= 1;
if(rowIndex > rowEndIndex){
break;
}
for (int i = rowEndIndex; i >= rowIndex; i--) {
res[resIndex] = matrix[i][colIndex];
resIndex++;
}
colIndex += 1;
if(colIndex > colEndIndex){
break;
}
}
return res;
}
}