题解 | #顺时针打印矩阵(JS)#

顺时针打印矩阵

http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a

思路

首先明确题意,就是从第一个元素开始顺时针访问矩阵。
我的思路是设置好边界,记录当前坐标(从[0,0]开始),每次碰到边界就改变方向,同时也要修改边界
为了让这些操作同步,用一个now变量来记录当前的下标,无论是方向还是比较的边界(实际我们可以看到每次只向一个方向走,只需要判断该方向对应的边界即可)。
我是按照的右、下、左、上来设置的,但是我发现进行比较和需要修改的边界并不是同一个,比如一开始是往右走,碰壁了之后需要修改的是“上”这个方向的边界。因此我进行了位移对应过去也很容易。
我的思路和官方下面那位大哥的java代码的思路类似,结合代码来理解吧。

代码

function printMatrix(matrix)
{
    // write code here
  let ans = [];
  if(!matrix) return ans;
  let m = matrix.length;
  let n = matrix[0].length;
  if (m === 0 || n === 0) return ans;
  if (m === 1) return matrix[0]; // 一行
  if (n === 1) { // 一列
      for (let i = 0; i < m; i++) {
          ans.push(matrix[i][0]);
      }
      return ans;
  }

  let boundary = [n - 1, m - 1, 0, 0]; // 右下左上的边界
  let change = [-1, -1, 1, 1]; // 上面的边界对应的修改值
  let dir = [[0, 1],[1, 0],[0, -1],[-1, 0]]; // 右下左上方向移动的x、y值
  let now = 0; // 当前方向下标
  let nx = 0, ny = 0; // 当前坐标
  for (let i = 0; i < m * n; i++) {
    ans.push(matrix[nx][ny]);
    // 按照给定方向移动
    nx += dir[now][0];
    ny += dir[now][1];
    // 如果是0或2,则需要与边界对比的是x坐标,否则是y坐标
    if ((now % 2 === 0 && ny === boundary[now]) || (now % 2 !== 0 && nx === boundary[now])) {
      // 触碰边界,对边界进行修正,再修改方向
      let cnow = (now + 3) % 4;
      boundary[cnow] += change[cnow];
      now = (now + 1) % 4;
    }
  }
    return ans
}
module.exports = {
    printMatrix : printMatrix
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务