19.顺时针打印矩阵

题目

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

如果输入如下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;
}