给定多维数组,返回包含对角线总和的数组

时间:2019-01-22 00:38:07

标签: javascript arrays algorithm math

给出一个多维数组,返回一个包含对角线总和的数组。

例如:

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]
]));

2 个答案:

答案 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 = 0y = <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-rigthtop-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)));