大师兄

1. 题目描述

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

2. 思路分析

既然是顺时针打印,其实就是由外向内一圈圈打印,将过程分为 2 步:

第一步:printMatrix函数,确定要打印的圈的左上角坐标(比较简单)

第二步:printMatrixInCircle函数,根据左上角坐标,顺时针打印这一圈的信息。这个过程又分为四步:左上 -> 右上 -> 右下 -> 左下 -> 左上。

3. 代码实现

如果觉得,函数printMatrixInCircle的条件判断不清楚,可以配合下面这张图一起看:

/**
* 打印从 (start, start) 与 (endX, endY) 围成的一圈矩形
* @param {Array} arr
* @param {Number} cols
* @param {Number} rows
* @param {Number} start
*/
function printMatrixInCircle(arr, cols, rows, start) {
let endX = cols - start - 1,
endY = rows - start - 1,
result = "";
// 从 左上 到 右上 打印一行
for (let i = start; i <= endX; ++i) {
result = result + " " + arr[start][i];
}
// 从 右上 到 右下 打印一行
if (start < endY) {
for (let i = start + 1; i <= endY; ++i) {
result = result + " " + arr[i][endX];
}
}
// 从 右下 到 左下 打印一行
if (start < endX && start < endY) {
for (let i = endX - 1; i >= start; --i) {
result = result + " " + arr[endY][i];
}
}
// 从 左下 到 左上 打印一行
if (start < endX && start < endY - 1) {
for (let i = endY - 1; i >= start + 1; --i) {
result = result + " " + arr[i][start];
}
}
console.log(result);
}
/**
* 打印的外层函数, 主要用于控制要打印的圈
* @param {Array} arr
*/
function printMatrix(arr) {
if (!Array.isArray(arr) || !Array.isArray(arr[0])) {
return;
}
let start = 0,
cols = arr[0].length,
rows = arr.length;
while (cols > start * 2 && rows > start * 2) {
console.log(`${start + 1}层: `);
printMatrixInCircle(arr, cols, rows, start);
++start;
}
}
/**
* 以下是测试代码
*/
printMatrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
printMatrix([[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 10, 11]]);