每日一练(一)

172 阅读1分钟

题目:给出一个m * n的矩阵(m行,n列),请按照顺时针螺旋顺序返回元素。例如,给出以下矩阵:

[
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

应该返回[1,2,3,6,9,8,7,4,5].

我的解答:

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
    var rawPointer = 0; //行指针
    var colPointer = 0; //列指针
    if (!matrix) {
        matrix = [
         [ 1, 2, 3 ],
         [ 4, 5, 6 ],
         [ 7, 8, 9 ]
        ];
    }
    var raw = matrix.length;
    if (raw < 2 && !matrix[0]) {
        return matrix;
    }
    var col = matrix[0].length;
    var _raw = raw,
        _col = col;
    var tempArr = [];
    var isReadingLine = true;
    var rawFlag = -1;
    var colFlag = -1;
    for (var i = 0; i < raw * col;) {
        if (isReadingLine) {
            //读行
            colFlag = -colFlag;
            for(var m = 0; m < _col; m ++,colPointer += colFlag) {
                tempArr.push(matrix[rawPointer][colPointer]);
            }
            //恢复行指针到行指针方向末尾
            colPointer -= colFlag;

            isReadingLine = false;
            //总执行进度跳跃
            i += _col;
            //执行完一行之后,下次列循环长度减1
            _raw --;
            //列指针向前挺进加1
            rawPointer += colFlag;
        } else {
            //读列
            rawFlag = -rawFlag;
            for(var n = 0; n < _raw; n ++, rawPointer += rawFlag) {
                tempArr.push(matrix[rawPointer][colPointer]);
            }
            //恢复行指针到行指针方向末尾
            rawPointer -= rawFlag;
            isReadingLine = true;
            //执行完一行之后,下次行循环长度减1
            i += _raw;

            _col --;
            //行指针往后退一位
            colPointer -= rawFlag;
        }
    }
    return tempArr;
}