欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

顺时针打印矩阵

程序员文章站 2022-03-05 16:21:18
...

题目要求:
        输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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]);
            }
     }
    }
}
相关标签: 矩阵