目录
一、问题描述
给定一个下面这样的二维数组。
const array = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], ];
如果我们将上面这个二维数据的左上角(数字1)作为最高点,右下角(数字16)作为最低点,那么有:
- 第一层的数字有:1。
- 第二层的数字有:5、2。
- 第三层的数字有:9、6、3。
- 第四层的数字有:13、10、7、4。
- 第五层的数字有:14、11、8。
- 第六层的数字有:15、12。
- 第七层的数字有: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]], ];
然后不难得发现,其实我们的打印顺序是:
- 先打印第0层的元素:[0, 0](x和y轴坐标和为0)。
- 再打印第1层的元素:[0, 1]、[1, 0](x和y轴坐标和为1,y轴值从1递减到0,x轴跟着递增)。
- 再打印第1层的元素:[0, 2]、[1, 1]、[2, 0](x和y轴坐标和为2,y轴值从2递减到0,x轴跟着递增)。
- ……
- 再打印第4层的元素:[2, 3]、[3, 2](x和y轴坐标和为5,y轴的值从3减少到2,x轴跟着递增)(注意这里y轴最大值不是坐标和5,因为数组长度决定了x和y轴的最大值都只能是3)。
- 最后打印第6层的元素:[3, 3](x和y轴坐标和为6)。
所以,我们的代码可以这样写:
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);
在Chrome浏览器里的执行结果见下图: