JavaScript принимает сумму диагоналей вложенного массива с различной длиной

У меня есть вложенный массив, в котором каждый массив на единицу меньше по длине, чем предыдущий массив. Я хочу взять сумму элементов по диагонали и не могу понять, как это сделать.

Вот табличное представление того, что я пытаюсь сделать:

В JavaScript вложенный массив выглядит следующим образом:

let outArr = [];
const intArr= [0,2,4,6,8,10];
for (let i = intArr.length; i >0; i--) {
  outArr.push(intArr.slice(0,i));
}

Я хочу, чтобы мой массив результатов был [0,2,6,12,20,30]. Использую ли я тройной вложенный цикл? Один для выходного массива, а затем два цикла для внутреннего/внешнего массива?

вам нужно будет поддерживать массивы с динамическим размером? или это единственные массивы в решении? вы используете 2D-массив? можешь перечислить все свои данные? похоже, вы будете использовать 6 разных массивов.

This Guy 17.01.2023 17:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
63
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

const array1 = [ 0, 2, 4, 6, 8, 10 ];
const array2 = [ 0, 2, 4, 6, 8 ];
const array3 = [ 0, 2, 4, 6 ];
const array4 = [ 0, 2, 4 ];
const array5 = [ 0, 2 ];
const array6 = [ 0 ];

const sum0 = array1[0];
const sum1 = array1[1] + array2[0];
const sum2 = array1[2] + array2[1] + array3[0];
const sum3 = array1[3] + array2[2] + array3[1] + array4[0];
const sum4 = array1[4] + array2[3] + array3[2] + array4[1] + array5[0];
const sum5 = array1[5] + array2[4] + array3[3] + array4[2] + array5[1] + array6[0];

const result = [
  sum0,
  sum1,
  sum2,
  sum3,
  sum4,
  sum5 ];

console.info(result);
  • Получить последние элементы массива, в первый индекс вставить первый в массив результатов, а из следующего индекса добавить последнее вставленное значение из результата и текущего значения.

function getDiagonalSum(arr) {
  const lastArrays = [];
  const result = [];
  arr.forEach(currentArray => {
    lastArrays.push(currentArray[currentArray.length - 1]);
  });

  for (let i = 0; i < lastArrays.length; i++) {
    if (i === 0) {
      result.push(lastArrays[i])
    } else {
      let total = lastArrays[i] + result[i - 1];
      result.push(total);
    }
  }
  return result;
}
const arr = [
  [1, 2, 3],
  [1, 2],
  [1]
];
const result = getDiagonalSum(arr);
console.info(result);
console.info("Your array input...")
const userArray = [
  [0, 0, 0, 0, 0, 0],
  [2, 2, 2, 2, 2],
  [4, 4, 4, 4],
  [6, 6, 6],
  [8, 8],
  [10]
];
const userResult = getDiagonalSum(userArray);
console.info(userResult);
Ответ принят как подходящий

Вы можете выполнить итерацию по массиву один раз, отслеживая текущую совокупную сумму и добавляя ее в массив на каждой итерации. (Обратите внимание, что диагональные суммы здесь — это просто суммы префиксов массива.)

let outArr = [];
const intArr= [0,2,4,6,8,10];
let curr = 0;
for (const x of intArr) outArr.push(curr += x);
console.info(outArr);

Для более общего случая диагональных сумм вы можете использовать вложенный цикл следующим образом:

let arr = [[0, 1, 2, 3],[0, 0, 2],[1, 2],[0]];
let res = [];
for (let i = arr.length - 1; i >= 0; i--) {
  let sum = 0;
  for (let j = 0; j < arr.length - i; j++) sum += arr[j][arr[j].length - 1 - i];
  res.push(sum);
}
console.info(res);

Будет ли это также работать, если вложенные массивы не имеют одинаковых значений, но имеют один и тот же шаблон длины? Например [[0,1,2,3],[0,0,2],[1,2],[0]]? Извините, я должен уточнить это в своем вопросе. Спасибо за это элегантное решение.

Yolo_chicken 17.01.2023 18:30

@Yolo_chicken Я обновил свой ответ для общего случая.

Unmitigated 17.01.2023 21:13

В основном вам нужно получить индексы, которые дают вам диагональные значения. Держите два счетчика и увеличивайте один и уменьшайте один и делайте это в пределах границ для каждой итерации.

Согласно вашему коду, если intArr является вложенным массивом со всеми строками, то это вернет вам диагональные суммы.

let finalArr = [];
for (let i = 0; i <intArr.length; i++) {
  let temp = 0, k=i;
  for(let j=0;j<=i;j++){
    temp += outArr[j][k--];
  } 
  finalArr.push(temp);
}

Существует также более простой способ сделать это, если вы не хотите работать с вложенным массивом, поскольку это, по сути, кумулятивная сумма, поэтому вам не нужен вложенный массив.

let intArr= [0,2,4,6,8,10];
let cumulative = 0, finalArr = [];;
for (let x of intArr) {
   finalArr.push(cumulative += x);
}
let inputArr=[]; let sumEntry =[]
       
       
        inputArray.reverse().forEach((subArr)=>{
       sumEntry.push((subArr.reduce((l,r)=>l+r,0));
        });
inputArray.reverse().push(sumEntry);

Вы можете сопоставить каждый элемент с суммой самого себя со всеми элементами с меньшим индексом, чем он сам.

  • Используйте Array#map для выполнения сопоставления
  • Используйте Array#reduce для выполнения сложения

const 
    intArr = [0,2,4,6,8,10],
    
    outArr = intArr.map(
        (v,i,a) => a.slice(0,i+1).reduce((a,b) => a+b)
    );
    
console.info( outArr );

В качестве альтернативы .....

Вы можете немного изменить свой код, чтобы сделать эту версию более эффективной, чем приведенная выше:

const 
    outArr = [],
    intArr = [0,2,4,6,8,10];
    
for( const [i, v] of intArr.entries() ) {
    outArr.push( (outArr[i-1] || 0) + v );
}

console.info( outArr );

Другие вопросы по теме