Я пытаюсь решить эту проблему "Сумма вложенного списка": 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 не срабатывает, и я получаю другой ответ.
Может кто-нибудь указать мне на ошибку?
Также не увеличивайте depth таким образом; просто передайте depth + 1 в рекурсивном вызове.
Понятно. Спасибо! но когда я отправляю его на leetcode, я все равно получаю ожидаемое решение как NaN
Это мой код: `` 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 {сумма + = значение * глубина; }}; сумма возврата; }; `` ''
У вас все еще есть этот бессмысленный return в обратном вызове .forEach(). Добавление кода в комментарии работает не очень хорошо; обновите вопрос, если хотите добавить больше контекста.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать 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}
*/
Это бесполезно для
return, что-то из итерации.forEach().