立诚勿怠,格物致知
It's all about connecting the dots

二维数组斜向访问

一、问题描述

给定一个下面这样的二维数组。

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浏览器里的执行结果见下图:

赞(1) 打赏
文章名称:《二维数组斜向访问》
文章链接:https://www.orzzone.com/array-slash-visit.html
商业联系:yakima.public@gmail.com

本站大部分文章为原创或编译而来,对于本站版权文章,未经许可不得用于商业目的,非商业性转载请以链接形式标注原文出处。
本站内容仅供个人学习交流,不做为任何投资、建议的参考依据,因此产生的问题需自行承担。

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力提供更多优质内容!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册