Если дан многомерный массив, вернуть массив, содержащий сумму диагоналей - PullRequest
0 голосов
/ 22 января 2019

Учитывая многомерный массив, вернуть массив, содержащий сумму диагоналей.

Например:

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 голосов
/ 22 января 2019

Предположим, на данный момент, что ваш текущий ввод:

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)));
0 голосов
/ 22 января 2019

Сначала создайте начальный массив чисел (для диагональных сумм), затем используйте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...