剑指offer--面试题20:顺时针打印矩阵--Java实现

来源:互联网 发布:爸爸网络词的意思 编辑:程序博客网 时间:2024/05/21 06:47

题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:

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

解题思路:

我们可以把矩阵想象成若干个圈,我们可以用一个循环来打印矩阵,每一次打印矩阵中的一个圈。

如下图:
这里写图片描述

分析循环结束的条件:
第一圈开始的坐标是(0,0)
第二圈开始的坐标是(1,1)


于是我们选取矩阵中选取左上角(start, start) 的一圈作为分析目标:
对于5×5的矩阵,最后一圈只有一个数字,对应的坐标为(2, 2)
上方输出了2行,那么下方也输出了2行。5 > 2 × 2,对于一个6×6矩阵而言,最后一圈有4个数字 6 > 2 × 2,依然成立。于是我们可以得出,让循环继续的条件是 columns > startX × 2并且
rows > startY × 2。

public static void printMatrixClockwisely(int[][] numbers, int columns, int rows){        if(numbers == null || columns <= 0 || columns <= 0){            return;        }        int start = 0;        while(columns > start * 2 && rows > start * 2){            printMatrixIncCircle(numbers, columns, rows, start);            start ++;        }    }

下面分析怎么打印一圈的数:

这里写图片描述

打印矩阵最里面一圈可能只需要三步、两步甚至一步

第一步:从左右向右总是需要的
第二步:从上到下,条件:终止行号 > 初始行号
第三步:从右到左,条件:终止行号 > 初始行号 && 终止列号 > 初始列号
第四步:从上到下,条件:终止列号 > 初始列号 && 终止行号 > 开始行号 + 1

public static void printMatrixIncCircle(int[][] numbers, int columns,            int rows, int start) {        int endX = columns - 1 - start;        int endY = rows - 1 - start;        for(int i = start; i <= endX; i++){            System.out.println(numbers[start][i]);        }        if(endY > start){            for(int i = start + 1; i <= endY; i++){                System.out.println(numbers[i][endX]);            }        }        if(endY > start && endX > start){            for(int i = endX - 1; i >= start; i--){                System.out.println(numbers[endY][i]);            }        }        if(endY - start > 1 && endX > start){            for(int i = endY - 1; i >= start + 1; i--){                System.out.println(numbers[i][start]);            }        }    }
0 0
原创粉丝点击