牛客刷题之顺时针打印矩阵

题目描述

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

解题思路:

       这道题重点在于边界条件的判断是否准确,然后顺时针一圈一圈的打印就可以了。

       打印一圈分为四个步骤:

                                    (1)从左到右打印一行;

                                    (2)从上到下打印一列;

                                    (3)从右到左打印一行;

                                    (4)从下到上打印一列。

      每一步根据起始坐标和终止坐标用一个循环就可以打印出一行或者一列。但是最后一圈可能只有一行、只有一列或者只有一个数,这时就不再需要以上四步来完成,所以需要进一步细化打印每一步的前提条件:

                                    (1)第一步是必须的,因为打印一圈至少需要一步。如果只有一行就不需要第二步了。

                                    (2)执行第二步的前提条件是终止的行号大于起始的行号;

                                    (3)执行第三步的前提条件是终止行号大于起始行号,并且终止列号大于起始列号;

                                    (4)执行第四步的前提条件是终止的行号比起始的行号至少大2,同时终止的列号要大于起始列号。

具体代码如下:

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       int rows = matrix.length;
        int columns = matrix[0].length;
        if(matrix == null || rows <=0 || columns <=0){
            return null;
        }
        ArrayList<Integer> arr =  new ArrayList<>();
        int start = 0;
        while (columns > start *2 && rows >start * 2){
            int endX = columns - 1 -start;//列数
            int endY = rows -1 - start;//行数
            //从左到右打印一行
            for(int i = start;i<= endX;i++){
                //int number = array[start][i];
                arr.add(matrix[start][i]);
            }
            //从上到下打印一列
            if (endY>start){
                for(int i = start+1;i<=endY;i++){
                 arr.add(matrix[i][endX]);
                }
            }
 
            //从右到左打印一行
            if(endX>start && endY>start){
                for(int i = endX-1;i>=start;i--){
                  arr.add(matrix[endY][i]);
                }
            }
 
            //从下到上打印一列
            if(endX>start && start<endY-1) {
                for (int i = endY - 1; i >= start + 1; i--) {
                   arr.add(matrix[i][start]);
                }
            }
            start = start + 1;
        }
        return arr;
    
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值