「剣指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) です.は、一周左上隅と右下隅座標から「左から右へ」、「上から下へ」、「右から左へ」、「下から上へ」と印刷が必要な点を判断する. コードを実現
テーマの説明
行列を入力して、外向から時計回りの順に数字を順次印刷します.たとえば、行列を入力すると、1 2 3 4、5 6 6、7 7、11、14、14、15、14、13、5、6、7、11、10.
考え方
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
}