我想使用javascript获取矩阵数组的所有对角线。假设输入和输出如下:
input = [
[1,2,3],
[4,5,6],
[7,8,9],
]
output = [
[1],
[4,2],
[7,5,3],
[8,6],
[9],
]
如何将输入转换为输出?我怎么能这样做,它适用于任何大小的方格(2x2,3x3,4x4等)?
谢谢!
答案 0 :(得分:0)
第一种想到的方式(不一定是最佳方式)只是让一个循环沿着正方形的左边缘运行,然后是沿着底部边缘运行的循环。广场。换句话说,我编写的代码完全按照手工获取对角线的方式执行,没有巧妙的优化。
请注意,这应适用于任何大小的方块,但不会尝试处理矩形:我将其留作读者练习。
function getDiagonals(m) {
var s, x, y, d,
o = [];
for (s = 0; s < m.length; s++) {
d = [];
for(y = s, x = 0; y >= 0; y--, x++)
d.push(m[y][x]);
o.push(d);
}
for (s = 1; s < m[0].length; s++) {
d = [];
for(y = m.length - 1, x = s; x < m[0].length; y--, x++)
d.push(m[y][x]);
o.push(d);
}
return o;
}
var output = getDiagonals(input);
我给了它一些简短的测试,它似乎有效,但你可以尝试使用this demo。
答案 1 :(得分:0)
您可以使用:
var output = new Array(2*input.length-1);
for(var i=0; i<output.length; ++i) {
output[i] = [];
if(i < input.length) for(var j=0; j<=i; ++j)
output[i].push(input[i-j][j]);
else for(var j=input.length-1; j>i-input.length; --j)
output[i].push(input[j][i-j]);
}
或者这个:
var output = new Array(2*input.length-1);
for(var i=0; i<output.length; ++i) {
output[i] = [];
for(var j=Math.min(i, input.length-1); j>Math.max(-1, i-input.length); --j)
output[i].push(input[j][i-j]);
}
答案 2 :(得分:0)
const arr = [
[11, 2, 4],
[4, 5, 6],
[10, 8, 12]
];
function diagonalDifference(arr) {
const primaryDiagonal = arr
.map((e, i) => e[i])
.reduce((mem, curr) => mem + curr, 0);
const secondaryDiagonal = arr
.map((e, i) => {
let index = arr.length - i -1;
return e[index];
})
.reduce((mem, curr) => mem + curr, 0);
return Math.abs(primaryDiagonal - secondaryDiagonal);
}
console.log(diagonalDifference(arr));