剑指 Offer 29. 顺时针打印矩阵

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

示例 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;
        }


 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值