剑指offer 每日一练 - 矩阵的顺时针打印

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
题目分析:题目的重点主要是边界的判断问题 分为主的循环函数和打印的函数。主循环的函数主要控制的是打印的轮数,打印函数控制的是每一次打印这一轮的过程。 

我们定义几个参数 :columns列数  rows 行数 [startx(横坐标)starty(纵坐标)]每次循环开始的起点或者说是左上角坐标(我们可以发现startx和starty的大小是一样的) ,右下角坐标[endx,endy].

剑指offer 每日一练 - 矩阵的顺时针打印

(上图为网络图片)

由上图我们可以看到主循环的边界条件应该是columns>start*2&&rows>start*2

打印函数分为四部分 1:从左到右无限制 2:上到下 start<endy  3 右到左 start<endx(一列)&&start<endy(一行)4 下到上 start<endy-1(一行)&&start<endx(一列) 

从上到下不用限制因为从上到下最先执行,如果存在一列的情况是需要打印的。

下面是java的代码

import java.util.ArrayList;
public class Solution {
    ArrayList<Integer> list = new ArrayList<>();
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        int rows = matrix.length;
        int columns = matrix[0].length;
        int start = 0;
        while(rows>start*2&&columns>start*2){
            printer(matrix,rows,columns,start);
            start++;
        } 
        return list;
    }
    public void printer(int[][]matrix,int rows,int columns,int start){
        
        int endx = columns - 1 - start;  
        int endy= rows - 1 - start;
        
        /*分四部分打印*/
        /*左到右*/
        for(int i=start;i<=endx;i++){
            list.add(matrix[start][i]);
        }
       /* 上到下*/
        if(start<endy){
            for(int i=start+1;i<=endy;i++){
                list.add(matrix[i][endx]);
            }
        }
        /*右到左*/
        if(start<endx&&start<endy){
            for(int i=endx-1;i>=start;i--){
                list.add(matrix[endy][i]);
            }
        }
        /*最后是上到下因为前面三部分遍历过了所以到最后的判断条件start>endx&&start<endy-1 */
        if(start<endx&&start<endy-1){
            for(int i=endy-1;i>=start+1;i--){
                list.add(matrix[i][start]);
            }
        }
    }
    
}