顺时针/逆时针打印矩阵

1,841 阅读1分钟

实现思路

image

具体代码

创建矩阵

function createMatrix(row, col) {
    if (col === undefined) col = row;

    const matrix = [];
    for (let i = 0; i < row; i++) {
        let rowItems = [];
        for (let j = 0; j < col; j++) {
            rowItems.push(i * col + j + 1);
        }
        matrix.push(rowItems);
    }
    return matrix;
}

function printMatrix(matrix) {
    let row = matrix.length;
    let col = matrix[0] && matrix[0].length;
    if (!row || !col) return;

    let max = 0;
    for (let i = 0; i < row; i++) {
        for (let j = 0; j < col; j++) {
            let cell = matrix[i][j];
            max = Math.max(max, String(cell).length);
        }
    }

    let lines = [];
    for (let i = 0; i < row; i++) {
        lines.push(matrix[i].map(cell => {
            return `${' '.repeat(max)}${cell}`.substr(-max);
        }).join(', '));
    }

    console.log(lines.join('\n'));
}

顺时针打印

function printMatrixClockwise(matrix) {
    let sx = 0; // start x
    let sy = 0; // start y
    let ex = matrix[0].length - 1; // end x
    let ey = matrix.length - 1; // end y

    let arr = [];
    while (sx <= ex && sy <= ey) {
        for (let i = sx; i < ex; i++) {
            arr.push(matrix[sy][i]);
        }

        for (let i = sy; i < ey; i++) {
            arr.push(matrix[i][ex]);
        }

        for (let i = ex; i > sx; i--) {
            arr.push(matrix[ey][i]);
        }

        for (let i = ey; i > sy; i--) {
            arr.push(matrix[i][sx]);
        }

        sx++;
        sy++;
        ex--;
        ey--;
    }

    // 存在中心点
    if (--sx === ++ex && --sy === ++ey) {
        arr.push(matrix[sy][sx]);
    }

    console.log(arr.join(', '));
}

逆时针打印

function printMatrixAnticlockwise(matrix) {
    let sx = 0; // start x
    let sy = 0; // start y
    let ex = matrix[0].length - 1; // end x
    let ey = matrix.length - 1; // end y

    let arr = [];
    while (sx <= ex && sy <= ey) {
        for (let i = sy; i < ey; i++) {
            arr.push(matrix[i][sx]);
        }

        for (let i = sx; i < ex; i++) {
            arr.push(matrix[ey][i]);
        }

        for (let i = ey; i > sy; i--) {
            arr.push(matrix[i][ex]);
        }

        for (let i = ex; i > sx; i--) {
            arr.push(matrix[sy][i]);
        }

        sx++;
        sy++;
        ex--;
        ey--;
    }

    // 存在中心点
    if (--sx === ++ex && --sy === ++ey) {
        arr.push(matrix[sy][sx]);
    }

    console.log(arr.join(', '));
}

运行结果

let matrix = createMatrix(4, 5);

printMatrix(matrix);
/*
 1,  2,  3,  4,  5
 6,  7,  8,  9, 10
11, 12, 13, 14, 15
16, 17, 18, 19, 20
*/

printMatrixClockwise(matrix);
// 1, 2, 3, 4, 5, 10, 15, 20, 19, 18, 17, 16, 11, 6, 7, 8, 9, 14, 13, 12

printMatrixAnticlockwise(matrix);
// 1, 6, 11, 16, 17, 18, 19, 20, 15, 10, 5, 4, 3, 2, 7, 12, 13, 14, 9, 8