给出一个多维数组,返回一个包含对角线总和的数组。
例如:
input:
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
output:
[ 7, 12, 15, 8, 3 ]
function addDiagonals(matrix) {
let sum = 0;
let j = matrix[0].length - 1;
for (let i = 0; i < matrix.length; i++, j--) {
sum += matrix[i][j];
sum += matrix[i][i];
}
return sum;
}
console.log(addDiagonals([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]));
我能够找到对角线的总和。但是我需要知道如何找到每个对角线的总和。
但是我需要完成此操作:
function diagonalSum(matrix) {
let sum = 0;
let res = [];
for (let i = 0; i < matrix.length; i++) {
let j = matrix.length - i - 1;
res[i] = matrix[i][j];
console.log(`i = ${i} and j = ${j};`)
}
return res;
}
console.log(diagonalSum([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]));
答案 0 :(得分:4)
首先创建一个数字初始数组(用于对角线总和),然后使用reduce
进行迭代,并使用x索引和y索引以及数组长度来找出当前数字应使用的正确对角线索引添加到:
const input = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
const { length } = input;
const initial = new Array(length * 2 - 1).fill(0);
const output = input.reduce((a, subArr, y) => {
subArr.forEach((item, x) => {
const diagIndex = x - y + length - 1;
a[diagIndex] += item;
});
return a;
}, initial);
console.log(output);
另一个具有4x4数组的示例:
const input = [
[1, 2, 3, 9],
[4, 5, 6, 9],
[7, 8, 9, 9],
[2, 2, 2, 2]
];
const { length } = input;
const initial = new Array(length * 2 - 1).fill(0);
const output = input.reduce((a, subArr, y) => {
subArr.forEach((item, x) => {
const diagIndex = x - y + length - 1;
a[diagIndex] += item;
});
return a;
}, initial);
console.log(output);
的推导
const diagIndex = x - y + length - 1;
是:随着y
(列索引)增加,如果x
(行索引)保持不变,diagIndex
应该减少,因为您离左下角越来越近和输出和数组的索引0。因此,在const diagIndex =
的右侧,y
为负。随着x
的增加,如果y
保持不变,diagIndex
应该增加,因为您离左下角的距离越来越远,所以x
在右边为正手。
我们现在有
const diagIndex = x - y + num;
其中num
是其他
我们还知道在x = 0
和y = <square length - 1>
(左下角)处,对角线索引应为0,因此:
diagIndex = x - y + num;
0 = 0 - (length - 1) + num
length - 1 = num
将其插入:
const diagIndex = x - y + num;
const diagIndex = x - y + (length - 1);
答案 1 :(得分:0)
让我们暂时假设您当前的输入是:
const input = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
现在,假设我们被放置在该矩阵的最后一个数组(即带有[7, 8, 9]
的数组)上,并在遍历该数组的索引[0..4]
(是,从0到4)时进行跟踪从bottom-rigth
到top-left
的对角线。因此,第一个和最后一个对角线将由以下元素定义:
First Diagonal: input[2][0] -> input[1][-1] -> input[0][-2]
Last Diagonal: input[2][4] -> input[1][3] -> input[0][2]
现在,假设我们将访问那些数组的未定义索引的undefined
值映射到数字0
。然后,从这种方法获得的序列将是:
(Diagonal 1): 7 -> 0 -> 0 => Sum = 7
(Diagonal 2): 8 -> 4 -> 0 => Sum = 12
(Diagonal 3): 9 -> 5 -> 1 => Sum = 15
(Diagonal 4): 0 -> 6 -> 2 => Sum = 8
(Diagonal 5): 0 -> 0 -> 3 => Sum = 3
我希望您已经了解了这一点,因为下一个逻辑采用了这种方法来获取对角线的总和。
const input1 = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
const input2 = [
[1, 2, 3, 9],
[4, 5, 6, 9],
[7, 8, 9, 9],
[2, 2, 2, 2]
];
const getDiagonalsSums = (matrix) =>
{
let len = matrix.length;
let dSums = new Array(len * 2 - 1).fill(0);
for (var i = 0; i < dSums.length; i++)
{
for (var j = len - 1; j >= 0; j--)
{
dSums[i] += (matrix[j][i + j - len + 1] || 0);
}
}
return dSums;
}
console.log(JSON.stringify(getDiagonalsSums(input1)));
console.log(JSON.stringify(getDiagonalsSums(input2)));