实现一个上三角形版的蛇形矩阵

780 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

前言

哈喽各位友友们,我又来了,带来了新的经典问题:实现一个上三角形版的蛇形矩阵。为什么说这个问题呢?还是那个测试朋友碰到的。哈,那就来看看实现吧。

分析

// 说起蛇形矩阵, 可能大家是这样认为的。
[
    [1, 2, 3],
    [8, 9, 4],
    [7, 6, 5]
]
// 上三角形,又是这样的。
[
    [0, 1, 2, 3],
    [4, 5, 6],
    [7, 8]
    [9]
]
// 那二者结合一下,上三角形版的蛇形矩阵应该就是这样的
[
    [1, 3, 6, 10, 15],
    [2, 5, 9, 14],
    [4, 8, 13],
    [7, 12],
    [11]
]

画图来看,逻辑关系为这样。

image.png

清楚了数据结构,我们看一下输入输出:要求,输入一个数字n,输出对应的上三角蛇形矩阵。

好,清楚了数据结构,也清楚输入输出。那么我们来进行编码之前的分析。 我们先确定了每一行的输出规则:

  • 第一行,从第二列开始,之后每一列按照(2,3,4,5,...)的规律在前一列的基础上依次递增
  • 第二行,从第二列开始,之后每一列按照(3,4,5,6,...)的规律在前一列的基础上依次递增
  • 第三行,从第二列开始,之后每一列按照(4,5,6,7,...)的规律在前一列的基础上依次递增
  • ...
  • 第n行,从第二列开始,之后每一列按照(n+1,n+2, ...)的规律在前一列的基础上依次递增

确认了每一行的规则,对于列,我们只需要确认第一列的规则就可以了。 我们来看看第一列数字:1,2,4,7,11,...,可以看到,第一列,每一行都在按照(1,2,3,4,...)做递增操作。

确定了规律,我们就来编码实现吧。

实现

function snakeMatrix(n) {
// 定义蛇形矩阵开始的数字
let start = 0;
// 每一行增加的数字
let add = 0;
for (let i = 1; i < n + 1; i++) {
    // 每次行循环之前确定第一位数字
    start = add;
    let result = '';
    // 循环列
    for (let j = i; j < n + 1; j++) {
        // 列累加
        start += j;
        // 尾部判断
        if (j !== n) {
            result += start + ' ';
        }
        else {
            result += start;
        }
    }
    // 确定下一行开头
    add += i - 1;
    // 一次结束,输出一行
    console.log(result);
}

}

console.log(snakeMatrix(5));

/**
*1 3 6 10 15
*2 5 9 14
*4 8 13
*7 12
*11
*/

执行结果图如下:

image.png

总结

这道题也可以递归实现,也有专门的上三角蛇形矩阵公式:col(col+1)/2 + row(row+1)/2 + (col-1)row - row - (col-1) 式中,col代表列,row代表行,row>=1,col>=1。具体选用哪种实现就看个人喜好了。