Проблема алгоритма суммы веса вложенного списка

Я пытаюсь решить эту проблему "Сумма вложенного списка": https://leetcode.com/problems/nested-list-weight-sum/description/

Проблема:

Given the list [[1,1],2,[1,1]], return 10. (four 1's at depth 2, one 2 at depth 1)

Это мое решение.

var depthSum = function (nestedList, sum=0, depth=1) {
    nestedList.forEach((val) => {
        if (Array.isArray(val)) {
            depth = depth+1;
            return depthSum(val, sum, depth);
        } else {
            sum += val * depth;
        }
    });
    return sum;
};

Не уверен, что мне не хватает. Когда я отлаживаю его, в какой-то момент я получаю ответ, но return sum не срабатывает, и я получаю другой ответ.

Может кто-нибудь указать мне на ошибку?

Это бесполезно для return, что-то из итерации .forEach().

Pointy 06.06.2018 22:52

Также не увеличивайте depth таким образом; просто передайте depth + 1 в рекурсивном вызове.

Pointy 06.06.2018 22:54

Понятно. Спасибо! но когда я отправляю его на leetcode, я все равно получаю ожидаемое решение как NaN

TechnoCorner 06.06.2018 22:56

Это мой код: `` var depthSum = function (nestedList, sum = 0, depth = 1) {for (let i = 0; i <nestedList.length; i ++) {let val = nestedList [i]; если (Array.isArray (val)) {return depthSum (val, sum, depth + 1); } else {сумма + = значение * глубина; }}; сумма возврата; }; `` ''

TechnoCorner 06.06.2018 22:57

У вас все еще есть этот бессмысленный return в обратном вызове .forEach(). Добавление кода в комментарии работает не очень хорошо; обновите вопрос, если хотите добавить больше контекста.

Pointy 06.06.2018 23:01
Поведение ключевого слова "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) для оценки ваших знаний,...
1
5
124
3

Ответы 3

Вы можете использовать Array#reduce и опускать sum для каждого уровня, возвращая сумму для каждого уровня.

function depthSum(nestedList, level = 1) {
    return nestedList.reduce((sum, val) =>
        sum + (Array.isArray(val)
            ? depthSum(val, level + 1)
            : level * val),
        0);
};

console.info(depthSum([[1, 1], 2, [1, 1]]));

Итак, один способ справиться с этим.

Нет смысла возвращаться изнутри вашего forEach, вместо этого вам следует добавить сумму рекурсивного вызова к вашей текущей сумме. И поскольку вы это делаете, вам не нужно, чтобы sum был параметром вашей функции depthSum.

var nestedList = [[1,1],2,[1,1]];

var depthSum = function(nestedList, depth = 1) {
  var sum = 0;
  nestedList.forEach((val) => {
    if (Array.isArray(val)) {
      sum += depthSum(val, depth + 1);
    } else {
      sum += val * depth;
    }
  });
  return sum;
};

console.info(depthSum(nestedList))

В соответствии с требованиями кода в Leetcode следующий рабочий код.

    var depthSum = function (nestedList,  depth=1) {
    var res = 0;
    nestedList.forEach((val) => {
        if (val.isInteger() === false) {
            res += depthSum(val.getList(),  depth + 1);
        } else {
            res += val.getInteger() * depth;
        }
    });
    return res;
};

Вы не можете использовать Array.isArray(), потому что все члены вернут false. а также вы не можете напрямую получить доступ к значениям или списку. Вам нужно получить доступ через их API. Входные данные функции - это не просто массив. См. Тип ввода и API, представленные в спецификации, следующим образом:

     * function NestedInteger() {
 *
 *     Return true if this NestedInteger holds a single integer, rather than a nested list.
 *     @return {boolean}
 *     this.isInteger = function() {
 *         ...
 *     };
 *
 *     Return the single integer that this NestedInteger holds, if it holds a single integer
 *     Return null if this NestedInteger holds a nested list
 *     @return {integer}
 *     this.getInteger = function() {
 *         ...
 *     };
 *
 *     Set this NestedInteger to hold a single integer equal to value.
 *     @return {void}
 *     this.setInteger = function(value) {
 *         ...
 *     };
 *
 *     Set this NestedInteger to hold a nested list and adds a nested integer elem to it.
 *     @return {void}
 *     this.add = function(elem) {
 *         ...
 *     };
 *
 *     Return the nested list that this NestedInteger holds, if it holds a nested list
 *     Return null if this NestedInteger holds a single integer
 *     @return {NestedInteger[]}
 *     this.getList = function() {
 *         ...
 *     };
 * };
 */
/**
 * @param {NestedInteger[]} nestedList
 * @return {number}
 */

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