外观
给定一个下面这样的二维数组。
const array = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
];如果我们将上面这个二维数据的左上角(数字1)作为最高点,右下角(数字16)作为最低点,那么有:
现要求:写一段代码将array二维数组按上面说的层数由第一层开始逐层打印,对于每一层按从右往左的顺序进行打印(比如第二层先打印2再打印5,第三层先打印3然后6然后9,以此类推)。
题目中的数字仅用于方便我们去理解题目的意思,实际上不需要去关心这些数字具体是多少。
对长度和宽度都为m的正方形矩阵,层数n为2m - 1。
另外,我们将上面的数字都换成其对应的坐标,可得:
const array = [
[[0, 0], [0, 1], [0, 2], [0, 3]],
[[1, 0], [1, 1], [1, 2], [1, 3]],
[[2, 0], [2, 1], [2, 2], [2, 3]],
[[3, 0], [3, 1], [3, 2], [3, 3]],
];然后不难得发现,其实我们的打印顺序是:
所以,我们的代码可以这样写:
const array = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
];
function slashPrintArray (arr) {
const outputArr = [];
// 长宽一致的二维数组的长度
const arrLen = arr.length;
// 需要遍历的层数
const n = arrLen * 2 - 1;
// x和y轴最大索引值为数组长度减1
const maxIdx = arrLen - 1;
// 从第0层到第6层 逐层遍历
for (let i = 0; i < n; i++) {
const sum = i;
for (let y = Math.min(sum, maxIdx); y >= 0; y--) {
const x = sum - y;
if (x <= maxIdx) {
outputArr.push(arr[x][y]);
}
}
}
console.log(outputArr);
}
slashPrintArray(array);