持续创作,加速成长!这是我参与「掘金日新计划 · 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]
]
画图来看,逻辑关系为这样。
清楚了数据结构,我们看一下输入输出:要求,输入一个数字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
*/
执行结果图如下:
总结
这道题也可以递归实现,也有专门的上三角蛇形矩阵公式:col(col+1)/2 + row(row+1)/2 + (col-1)row - row - (col-1) 式中,col代表列,row代表行,row>=1,col>=1。具体选用哪种实现就看个人喜好了。