27、顺时针打印矩阵——剑指offer

顺时针打印矩阵

问题描述:顺时针打印矩阵


    首先考察基本功,逻辑分析能力

    本方法思想:一圈一圈的打印,每次打印的开始是(start,start),比如 0,0   1,1   2,2;判断条件是cols>2start  rows>2start;第二种是自己写的 只需要判断只有一行或者一列的情况,比较容易理解,有三种特殊情况,如下图所示,建议看第二种方法,更好理解



持续更新...

代码附下

Java实现:

package 顺时针打印矩阵;
/**
 * 顺时针打印矩阵
 * @author user
 *一圈一圈的打印,每次打印的开始是(start,start)
 *比如 0,0   1,1   2,2
 *判断条件是cols>2start  rows>2start
 *第二种是自己写的 只需要判断只有一行或者一列的情况,比较容易理解
 */

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

    private static void printStart(int[][] array) {
        // TODO Auto-generated method stub
        if (array == null || array.length <= 1 || array[0].length <= 1) {
            System.out.println("输入错误!");
            return;
        }
        int start = 0;
        int rows = array.length;
        int cols = array[0].length;
        while (cols > 2 * start && rows > 2 * start) {
            printMatrixCircle(array, cols, rows, start);
            start++;
        }
        System.out.println();
        start = 0;
        while (cols > 2 * start && rows > 2 * start) {
            printMatrixCircle2(array, cols, rows, start);
            start++;
        }
    }

    //这是第一种方法,可以选择跳过
    /**
     * 打印时会有多种特殊情况 需要多重判断
     * 
     * @param array
     * @param cols
     * @param rows
     * @param start
     */
    private static void printMatrixCircle(int[][] array, int cols, int rows, int start) {
        // TODO Auto-generated method stub
        int endX = cols - 1 - start;
        int endY = rows - 1 - start;
        // 从左到右打印第一行
        for (int i = start; i <= endX; i++) {
            System.out.print(array[start][i] + " ");
        }
        // 打印一列
        if (start < endY) {// 如果满足说明至少有两行,不满足说明原来的只有一行
            // 打印一列
            for (int i = start + 1; i <= endY; i++) {
                System.out.print(array[i][endX] + " ");
            }
        }
        // 从右到左打印
        if (start < endX && start < endY) {
            // 必须是两行两列以上
            for (int i = endX - 1; i >= start; i--) {
                System.out.print(array[endY][i] + " ");
            }
        }
        // 从下倒上打印
        if (start < endX && start < endY - 1) {
            for (int i = endY - 1; i > start; i--) {
                System.out.print(array[i][start] + " ");
            }
        }
    }
    //这是第二种方法
    private static void printMatrixCircle2(int[][] array, int cols, int rows, int start) {
        // TODO Auto-generated method stub
        int endX = cols - 1 - start;
        int endY = rows - 1 - start;
        // 说明只有一行了
        if (start == endY) {
            for (int i = start; i <= endX; i++) {
                System.out.print(array[start][i] + " ");
            }
            return;
        }
        // 说明只有一列了
        if (start == endX) {
            for (int i = start + 1; i <= endY; i++) {
                System.out.print(array[i][endX] + " ");
            }
            return;
        }
        // 从左到右打印第一行
        for (int i = start; i <= endX; i++) {
            System.out.print(array[start][i] + " ");
        }
        // 打印一列
        // 如果满足说明至少有两行,不满足说明原来的只有一行
        for (int i = start + 1; i <= endY; i++) {
            System.out.print(array[i][endX] + " ");
        }
        // 从右到左打印
        for (int i = endX - 1; i >= start; i--) {
            System.out.print(array[endY][i] + " ");
        }
        // 从下倒上打印
        for (int i = endY - 1; i > start; i--) {
            System.out.print(array[i][start] + " ");
        }
    }
}

持续更新...欢迎赞赏!

主页:https://blog.csdn.net/ustcer_93lk/article/details/80374008

如果有问题,欢迎大家留言,有更好的方法也期待大家告知。

猜你喜欢

转载自blog.csdn.net/ustcer_93lk/article/details/80374482
今日推荐