我想用javascript得到矩阵数组的所有对角线。假设输入和输出如下:
input = [
[1,2,3],
[4,5,6],
[7,8,9],
]
output = [
[1],
[4,2],
[7,5,3],
[8,6],
[9],
]如何将输入转换为输出?我怎么做才能使它适用于任何大小的正方形网格(2x2,3x3,4x4等)?
谢谢!
发布于 2018-10-24 16:47:33
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));发布于 2016-02-13 08:40:12
我想到的第一种方法(不一定是最好的方法)就是让一个循环沿着正方形的左边缘运行,然后是一个循环沿着正方形的底部边缘运行。换句话说,我写的代码完全是我手动获得对角线时所做的事情,没有经过巧妙的优化。
请注意,这应该适用于任何大小的正方形,但不会尝试处理矩形:我将其留给读者作为练习。
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。
发布于 2016-02-13 09:28:48
您可以使用以下命令:
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]);
}https://stackoverflow.com/questions/35373936
复制相似问题