剑指Offer 20 顺时针打印矩阵

题目

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

思路

  1. 采用一个二维数组来输入矩阵元素;
  2. 顺时针打印一个二维数组,将二维数组分成多个圈,起点为(start,start),从外圈向内圈循环遍历,循环继续的条件是数组的列和行都大于2start2*start
  3. 由于最后一圈可能退化成只有一行或者一列,将打印一圈分成四个过程,如下图所示:
    过程1是必须的;
    过程2的前提条件是终止行号大于起始行号;
    过程3的前提条件是起始列号小于终止列号;
    过程4的前提条件是终止行号大于起始行号加1,且起始列号小于终止列号;
    剑指Offer 20 顺时针打印矩阵

注意:
如何判定输入的array是有效的二维数组,要检查三个部分:
数组首地址是否为空;
是否为{},也就是array.length0的情况;
是否为{{}},这时array.length=1,但是array[0].length
0。
这里在(array.length==1&&array[0].length==0)有一个短路特性,只有当前面的表达式结果为true时,才进行后面的判断,否则直接返回false。

public class Q20PrintMatrixClockwisely {
    public static void printMatrixClockwisely(int[][] array){
        if (array==null||array.length==0||(array.length==1&&array[0].length==0))
            return;
        int start=0;
        int row=array.length;
        int column=array[0].length;
        while (row>(2*start)&&column>(2*start)){
            printCircleClockwisely(array,start,row,column);
            start++;
        }
    }

    public static void printCircleClockwisely(int[][] array,int start,int row,int column){
        int endRow=row-start-1;
        int endColumn=column-start-1;
        //过程1,从(start,start)到(start,endColumn)
        for (int i=start;i<=endColumn;i++){
            System.out.println(array[start][i]);
        }
        //过程2,从(start+1,endColumn)到(endRow,endColumn)
        if (endRow>start){
            for (int i=start+1;i<=endRow;i++)
                System.out.println(array[i][endColumn]);
        }
        //过程3,从(endRow,endColumn-1)到(endRow,start)
        if (start<endColumn){
            for (int i=endColumn-1;i>=start;i--)
                System.out.println(array[endRow][i]);
        }
        //过程4,从(endRow-1,start)到(start+1,start),完成一圈循环
        if (endRow>(start+1)&&start<endColumn)
            for (int i=endRow-1;i>start;i--)
                System.out.println(array[i][start]);
    }

    public static void main(String[] args) {
        int[][] array={{1,2,3,4},{12,13,14,5},{11,16,15,6},{10,9,8,7}};
        printMatrixClockwisely(array);
    }
}