题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,
如果输入如下4 X 4矩阵:
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.
详解
简单来说,就是不断地收缩矩阵的边界。
定义四个变量代表范围,up、down、left、right
- 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
- 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
- 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
- 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错
链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a?answerType=1&f=discussion
来源:牛客网
JS实现
function printMatrix(matrix) {
// write code here
let result = [];
if (matrix === null || matrix.length === 0 || matrix[0].length === 0) {
return result;
}
let up = 0,
down = matrix.length - 1;
let left = 0,
right = matrix[0].length - 1;
while (true) {
//最上面一行
for (let col = left; col <= right; col++) {
result.push(matrix[up][col]);
}
up++; //向下逼近
if (up > down) {
break;
} //判断是否越界
//最右面一列
for (let row = up; row <= down; row++) {
result.push(matrix[row][right]);
}
right--; //向左逼近
if (left > right) {
break;
} //判断是否越界
//最下面一行
for (let col = right; col >= left; col--) {
result.push(matrix[down][col]);
}
down--; //向上逼近
if (up > down) {
break;
} //判断是否越界
//最左边一列
for (let row = down; row >= up; row--) {
result.push(matrix[row][left]);
}
left++; //向右逼近
if (left > right) {
break;
} //判断是否越界
}
return result;
}