转圈打印矩阵

【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。
例如:
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
【要求】 额外空间复杂度为O(1)。

打印顺序

实现思想
我们可以定义两个点,一个是左上角的点(tR,tC),一个是右下角的点(dR,dC),利用这两个点即可确定矩阵的一个四周边界,我们可以利用这两个点来打印这四周边界,而里面的值,只需要我们往内挪动这两个点到里面小矩阵的两个角,继续打印.
代码

package com.day1.practice;


public class PrintEdge {
    public static void  spiralOrderPrint(int[][] matrix){
        //       (tR,tC)
        //
        //
        //
        //                        (dR,dC)
        int tR=0;//矩阵左上角的行坐标
        int tC=0;//矩阵左上角的列左边
        int dR=matrix.length-1;   //矩阵右下角的行坐标
        int dC=matrix[0].length-1;//矩阵右下角的列左边
        while (tR<=dR&&tC<=dC){
        prindEdge(matrix,tR,tC,dR,dC);
        tR++;tC++;
        dR--;dC--;
        }
    }
    public static void  prindEdge(int[][] matrix, int tR,int tC,int dR,int dC){
        if (tR==dR&&tC==dC){ //同点
        System.out.print(matrix[0][0]+" ");
        }
        if (tR==dR&&tC!=dC)//同行不同列
        {
            for(int i=tC;i<=dC;i++){
                System.out.print(matrix[tR][i]+" ");
            }
        }
        if (tC==dC&&tR!=dR)//同列不同行
        {
            for(int i=tR;i<=dR;i++){
                System.out.print(matrix[i][tC]+" ");
            }
        }
        if (tC!=dC&&tR!=dR){//不同列不同行
            //       (tR,tC)
            //
            //
            //
            //                        (dR,dC)
            int currC=tC;
            int currR=tR;
            while (currC!=dC) { //打印上边框
                System.out.print(matrix[tR][currC]+" ");
                currC++;
            }
            while (currR!=dR){//打印右边框
                System.out.print(matrix[currR][dC]+" ");
                currR++;
            }
            while (currC!=tC){//打印下边框
                System.out.print(matrix[currR][currC]+" ");
                currC--;
            }
            while (currR!=tR){//打印左边框
                System.out.print(matrix[currR][currC]+" ");
                currR--;
            }
        }
    }
    public static void main(String[] args){
        int [][] matrix = {
                {   1, 2,  3,  4   },
                {   5, 6,  7,  8   },
                {   9, 10, 11, 12  },
                {   13,14, 15, 16  }
        };
        spiralOrderPrint(matrix);
    }

}

你可能感兴趣的:(转圈打印矩阵)