「剣指offer」—JavaScript(19)時計回り印刷行列

1558 ワード

行列を時計回りに印刷します.
テーマの説明
行列を入力して、外向から時計回りの順に数字を順次印刷します.たとえば、行列を入力すると、1 2 3 4、5 6 6、7 7、11、14、14、15、14、13、5、6、7、11、10.
考え方
  • は座標を(0,0)、(1,1)…の点を(start,start)とし、開始座標として次の周の開始座標を(start+1,start+1)とする.
  • 次の週に入るかどうか(すなわち印刷が完了するかどうか)の条件はローソン>start*2&cols>start*2である.
  • プリント1周の左上隅座標は(start,start)、右下隅の座標は(cols-start-1,rows-start-1)
  • です.
  • は、一周左上隅と右下隅座標から「左から右へ」、「上から下へ」、「右から左へ」、「下から上へ」と印刷が必要な点を判断する.
  • コードを実現
    function printMatrix(matrix) {
        if (matrix == null || matrix.length == 0) {
            return;
        }
        var rows = matrix.length;
        var cols = matrix[0].length;
        var start = 0;
        var result = [];
    
        while (cols > start * 2 && rows > start * 2) {
            var endX = cols - 1 - start;
            var endY = rows - 1 - start;
            //        
            for (var i = start; i <= endX; i++) {
                result.push(matrix[start][i]);
            }
            //        
            if (start < endY) {
                for (var i = start + 1; i <= endY; i++) {
                    result.push(matrix[i][endX]);
                }
            }
            //        
            if (start < endX && start < endY) {
                for (var i = endX - 1; i >= start; i--) {
                    result.push(matrix[endY][i]);
                }
            }
            //        
            if (start < endX && start < endY - 1) {
                for (var i = endY - 1; i >= start + 1; i--) {
                    result.push(matrix[i][start]);
                }
            }
            start++;
        }
        return result
    }