输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
解题思路:x和y为二维数组的索引(也就是行和列),p为二维数组行的长度,q为二维数组列的长度,sum表示二维数组中数字的总个数,k用来表示每个输出过的数字
我的方法主要是一圈一圈的逐个打印出来,先打印外圈,再打印内圈,分别为从左到右,从上到下,从右到左,从下到上,所以写四个for循环,因为多行多列有内圈的存在(比如四行四列的矩阵内圈就是个两行两列的小矩阵),所以写个while(true)死循环,定义的a数组用来存储每个输出的数,直到k的个数等于sum也就是总个数,就把当前数组返回回去。
注意:开头的if判断必须加上,我刚开始就没加,评测就没过,会报Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0数组越界异常,因为matrix[0].length代表的是列数,matrix[0]代表的是行数,因为系统会传[]进去,所以你得返回[]回去,[]的一维数组长度为0,也就是相当于没有行数,matrix[0]代表的是第0行也可以看成第一行,所以发生越界了。也可以这样想,原来是长度1,行为0,现在长度为0,行还是0自然不可能发生,0就越界了。
代码如下:
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0];
}
int x=0;
int y=0;
int p=matrix.length;
int q=matrix[0].length;
int sum=p*q;
int k=0;
int[] a=new int[p*q];
while(true){
for(int i=0;i<q;i++){
System.out.print(matrix[x][y]+" ");
a[k]=matrix[x][y];
k++;
y++;
if(k==sum) return a;
}
y--;
x++;
for(int i=0;i<p-1;i++){
System.out.print(matrix[x][y]+" ");
a[k]=matrix[x][y];
x++;
k++;
if(k==sum) return a;
}
y--;
x--;
for(int i=0;i<q-1;i++){
System.out.print(matrix[x][y]+" ");
a[k]=matrix[x][y];
y--;
k++;
if(k==sum) return a;
}
x--;
y++;
for(int i=0;i<p-2;i++){
System.out.print(matrix[x][y]+" ");
a[k]=matrix[x][y];
x--;
k++;
if(k==sum) return a;
}
x++;
y++;
p=p-2;
q=q-2;
}
}
}