您的位置:首页 > 职场人生

剑指offer 面试题20 顺时针打印矩阵

2017-05-27 17:24 519 查看

剑指offer 面试题20 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针依次打印出每一个数字。

例如,如果输入矩阵如下:

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。

package algorithm.foroffer.top20;

/**
* Created by liyazhou on 2017/5/27.
* 面试题20:顺时针打印矩阵
*
* 题目:
*      输入一个矩阵,按照从外向里以顺时针依次打印出每一个数字。
*      例如,如果输入矩阵如下:
*          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。
*
* 问题:对这道题目懵圈
*
* 思路:对这道题目懵圈
*
*/
public class Test20 {

public static void printMatrixClockwisely(int[][] matrix){
if (matrix == null) return;

int rows = matrix.length;
int cols = matrix[0].length;
int start = 0;
// 没有发现这规律,不会定义这条件
while (rows > 2 * start && cols > 2 * start){
printMatrixCircle(matrix, start);
start ++;
}

}

private static void printMatrixCircle(int[][] matrix, int start) {
int rows = matrix.length;
int cols = matrix[0].length;

int endX = cols - 1 - start;
int endY = rows - 1 - start;

// 从左到右打印一行
for (int i = start; i <= endX; i++){
int number = matrix[start][i];
System.out.print(number + " ");
}

// 从上到下打印一列
if (start < endY){
for (int i = start + 1; i <= endY; i++){
int number = matrix[i][endX];
System.out.print(number + " ");
}
}

// 从右到左打印一行
if (start < endX && start < endY){
for (int i = endY - 1; i >= start; i--){
int number = matrix[endY][i];
System.out.print(number + " ");
}
}

// 从下到上打印一列
if (start < endX && start < endY - 1){
for (int i = endY - 1; i >= start + 1; i--){
int number = matrix[i][start];
System.out.print(number + " ");
}
}
}

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

printMatrixClockwisely(matrix);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: