例子
例如抽兆,如果輸入如下4 X 4矩陣:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
則依次打印出數(shù)字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路
image
借助圖形思考识补,將復(fù)雜的矩陣拆解成若干個(gè)圈,循環(huán)打印矩陣辫红,每次打印其中一個(gè)圈
設(shè)起點(diǎn)坐標(biāo)為(start,start)凭涂,矩陣的行數(shù)為rows,矩陣的列數(shù)為columns
循環(huán)結(jié)束條件為 rows>start2 并且 columns>start2
將打印一圈拆解為四部贴妻,
- 第一步:從左到右打印一行
- 第二步:從上到下打印一列
- 第三步:從右到左打印一行
-
第四步:從下到上打印一列
最后一圈很有可能出現(xiàn)幾種異常情況,打印矩陣最里面一圈可能只需三步切油、兩步、甚至一步
image
所以在每一行打印時(shí)要做好條件判斷:
能走到最后一圈名惩,從左到右必定會(huì)打印
結(jié)束行號(hào)大于開始行號(hào)澎胡,需要從上到下打印
結(jié)束列號(hào)大于開始列號(hào),需要從右到左打印
結(jié)束行號(hào)大于開始行號(hào)+1娩鹉,需要從下到上打印
// 順時(shí)針打印
function printMatrix(matrix) {
var start = 0;
var rows = matrix.length;
var coloums = matrix[0].length;
var result = [];
if (!rows || !coloums) {
return false;
}
while (coloums > start * 2 && rows > start * 2) {
printCircle(matrix, start, coloums, rows, result);
start++;
}
return result;
}
// 打印一圈
function printCircle(matrix, start, coloums, rows, result) {
var entX = coloums - start - 1;
var endY = rows - start - 1;
for (var i = start; i <= entX; i++) {
result.push(matrix[start][i]);
}
if (endY > start) {
for (var i = start + 1; i <= endY; i++) {
result.push(matrix[i][entX]);
}
if (entX > start) {
for (var i = entX - 1; i >= start; i--) {
result.push(matrix[endY][i]);
}
if (endY > start + 1) {
for (var i = endY - 1; i > start; i--) {
result.push(matrix[i][start]);
}
}
}
}
}