我试图解决这个问题"嵌套列表权重总和":https://leetcode.com/problems/nested-list-weight-sum/description/
问题:
鉴于列表[[1,1],2,[1,1]],返回10.(深度为2的四个1,一个2 在深度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
没有启动,我得到了不同的答案。
有人能指出我的错误吗?
答案 0 :(得分: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.log(depthSum([[1, 1], 2, [1, 1]]));
答案 1 :(得分:2)
这是解决问题的一种方法。
从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.log(depthSum(nestedList))
答案 2 :(得分:1)
根据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}
*/