顺时针打印矩阵

题目要求:
        输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
 
         我们可以将一个复杂的问题简单化,我们可以将它理解为是由从外圈到内圈的顺序依次打印的,所以我们可以把矩阵当作若干个圈。我们可以用一个循环来打印矩阵,每次打印矩阵中的一个圈。
        接下来我们要分析一下循环结束的条件。每个圈的开始位置的坐标都是相等的(start,start).第一圈为(0,0),第二圈为(1,1)…假设矩阵的行数为rows,列数是columns,我们会发现,开始位置的坐标与行数的关系,rows>2start&&columns>2start.所以就可以得出循环的中止条件。

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer>list=new ArrayList<>();
        int start=0;
        //循环的中止条件matrix.length>2*start&&matrix[0].length>2*start
        while (matrix.length>2*start&&matrix[0].length>2*start){
           //每个圈都给一个开始坐标与一个最大坐标,从而确定边界范围
            printMatrix(matrix,start,start,matrix.length-1-start,matrix[0].length-1-start,list);
            start++;
        } 
        return list;
    }
    private void printMatrix(int[][]matrix,int startx,int starty,int endx,int endy,ArrayList list){
    //当数组为一维数组的时候
     if (matrix.length==1&&matrix[0].length>=2){
            for (int i = starty; i <= endy; i++) {
                list.add(matrix[startx][i]);
            }
        }else if (matrix[0].length==1&&matrix.length>=2){
            for (int i=startx;i<=endx;i++){
                list.add(matrix[i][0]);
            }
        
        }else{
            //打印从左往右行
            for (int i = starty; i <= endy; i++) {
                list.add(matrix[startx][i]);
            }
            //打印从上到下列
            for (int i = startx + 1; i <= endx; i++) {
                list.add(matrix[i][endy]);
            }
            if (startx!=endx){
                //打印从右往左的行
                //当开始位置点和最大点不在一条直线时才执行,不如会出现重复元素
                for (int i = endy - 1; i >= starty; i--) {
                    list.add(matrix[endx][i]);
                }
            }
            //打印从下往上的行
            for (int i = endx - 1; i > startx; i--) {
                list.add(matrix[i][starty]);
            }
     }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值