JAVA代码—算法基础:转圈打印矩阵

转圈打印矩阵

给定一个整形矩阵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)

JAVA代码如下:

package com.bean.algorithmexec;

public class MatrixDemo {

    /*
     * 给定一个整形矩阵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)
     * */

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //初始化一个 4*4的整形矩阵,从第一行第一列从左向右,第二行,第三行,直到第四行依次赋值 1,2,...16.
        int[][] matrixDemo=new int[4][4];
        matrixDemo=createMatrix();
        printMatrix(matrixDemo);

        //转圈打印
        spiralOrderPrint(matrixDemo);

    }

    private static int[][] createMatrix() {
        // TODO Auto-generated method stub
        int matrix[][]=new int[4][4];
        int k=1;
        for(int i=0;i<4;i++) {
            for(int j=0;j<4;j++) {
                matrix[i][j]=k;
                k++;
            }
        }

        return matrix;
    }

    //顺序打印矩阵元素
    private static void printMatrix(int[][] matrix) {
        for(int i=0;i<4;i++) {
            for(int j=0;j<4;j++) {
                System.out.print(matrix[i][j]+"\t");
            }
            System.out.println();
        }

    }

    //转圈打印
    private static void spiralOrderPrint(int[][] matrix) {
        int tR=0;
        int tC=0;
        int dR=matrix.length-1;
        int dC=matrix[0].length-1;
        while(tR<=dR && tC<=dC) {
            printEdge(matrix, tR++, tC++, dR--,dC--);
        }
    }

    private static void printEdge(int[][] matrix, int tR, int tC, int dR, int dC) {
        // TODO Auto-generated method stub
        if(tR==dR) {
            //子矩阵只有一行时
            for(int i=tC;i<=dC;i++) {
            System.out.print(matrix[tR][i]+" ");
            }

        }else if(tC==dC) {
            //子矩阵只有一列时
            for(int i=tR;i<=dR;i++){
                System.out.print(matrix[i][tC]+" ");
            }

        }else {
            //一般情况
            int curC=tC;
            int curR=tR;
            while(curC!= dC) {
                System.out.print(matrix[tR][curC]+" ");
                curC++;
            }

            while(curR!= dR) {
                System.out.print(matrix[curR][dC]+" ");
                curR++;
            }

            while(curC!= tC) {
                System.out.print(matrix[dR][curC]+" ");
                curC--;
            }

            while(curR!= tR) {
                System.out.print(matrix[curR][tC]+" ");
                curR--;
            }
        }
    }


}

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值