剑指offer_顺时针打印矩阵

127 阅读1分钟

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

巧妙的二维数组的方式 new Array().fill().map(() => new Array().fill())

输入:
[  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]

输出:[1,2,3,4,8,12,11,10,9,5,6,7]

code

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var printMatrix = function(matrix) {
    const res = []
    const n = matrix.length
    if (!n) return res
    const m = matrix[0].length
    
    let dx = [-1, 0, 1, 0]
    let dy = [0, 1, 0, -1]
    
    const st = new Array(n).fill(0).map(() => new Array(m).fill(false)) //二维的状态数组
    
    let x = 0, y = 0, d = 1 //d表示方向,从右开始
    for(let i = 0; i < n * m; i ++) {
        res.push(matrix[x][y])
        st[x][y] = true
        let a = x + dx[d], b = y + dy[d]
        if (a < 0 || a >= n || b < 0 || b >= m || st[a][b]) {
            d = (d + 1) % 4 //改变方向后再更新
            a = x + dx[d] 
            b = y + dy[d]
        }
        x = a, y = b
    }
    return res
};