剑指offer系列之十八:顺时针打印矩阵

来源:互联网 发布:网络热销产品排行榜 编辑:程序博客网 时间:2024/06/06 13:06

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.

由于每打印完一圈都会改变其起始坐标,所以需要先确定矩阵大小与这个起始坐标的关系,比如一个4阶矩阵,第一圈的起始坐标是(0,0),第二圈的起始坐标是(1,1),打印两圈之后就打印结束了。在比如一个5阶矩阵,前两圈是一样的,第三圈的起始坐标是(2,2),而且只打印了一个数。我们可以发现只要起始坐标的两倍小于阶数就会一直转圈打印,所以停止转圈打印的条件就是起始坐标的两倍大于或者等于阶数。接下的问题是,每一圈的打印方法。因为有一个起始坐标,根据行数和列数就可以确定终点坐标。具体计算公式如下

endX=rowsstart1;endY=colsstart1

那么根据这个思路就可以写出如下代码(已被牛客AC):

package com.rhwayfun.offer;import java.util.ArrayList;public class PrintRecInCircle {    public ArrayList<Integer> printMatrix(int[][] matrix) {        if(matrix == null || matrix.length <= 0 || matrix[0].length <= 0){            return null;        }        ArrayList<Integer> list = new ArrayList<Integer>();        int rows = matrix.length;        int cols = matrix[0].length;        // 起点坐标        int start = 0;        // 只要每圈的起点坐标*2小于rows和cols就继续转圈打印        while (rows > start * 2 && cols > start * 2) {            printReInCircle(list,matrix, rows, cols, start);            start++;        }        return list;    }    /**     * 打印每一圈     * @param list 返回的集合     * @param matrix 矩阵     * @param rows 行数     * @param cols 列数     * @param start 起点坐标     */    private void printReInCircle(ArrayList<Integer> list,int[][] matrix, int rows, int cols,            int start) {        // 矩阵的终点坐标        int endX = rows - start - 1;        int endY = cols - start - 1;        // 打印从左到右的一行        for (int i = start; i <= endY; i++) {            list.add(matrix[start][i]);        }        // 打印从上到下的一列        if (start < endX) {            for (int j = start + 1; j <= endX; j++) {                list.add(matrix[j][endY]);            }        }        // 打印从右向左的一行        if (start < endY && start < endX) {            for (int k = endY - 1; k >= start; k--) {                list.add(matrix[endX][k]);            }        }        // 打印从下到上的一列        if (start < endY && start < endX - 1) {            for (int m = endX - 1; m >= start + 1; m--) {                list.add(matrix[m][start]);            }        }    }    public static void main(String[] args) {        int[][] matrix = new int[1][5];        matrix[0] = new int[]{1,2,3,4,5};        /*matrix[1] = new int[]{5,6,7,8,15};        matrix[2] = new int[]{9,10,11,12,19};        matrix[3] = new int[]{13,14,15,16,23};        matrix[4] = new int[]{17,18,19,20,21};*/        PrintRecInCircle p = new PrintRecInCircle();        ArrayList<Integer> list = p.printMatrix(matrix);        for (Integer integer : list) {            System.out.print(integer+" ");        }    }}
0 0
原创粉丝点击