扩展使用Javascript array.reduce辅助方法

时间:2017-07-06 17:58:15

标签: javascript ecmascript-6

背景

我正在学习关于Udemy的课程,该课程涵盖了所有ES6功能。在其中一个课程中,讲师谈到使用reduce辅助方法来解决流行的平衡括号面试问题。

我可以在没有reduce方法的情况下解决这个问题。虽然使用reduce方法,但它确实可以用更少的代码完成工作。我之前被要求在一次采访中找到括号的深度,并且想知道是否可以使用reduce在同一方法中完成所有这些操作。

我不知道为什么这个问题的补充让我很困惑,但我想学习。

问题

我一直试图弄清楚它有一段时间,可能是我对减少的工作缺乏了解。

示例

如果括号或均匀打开和关闭,则使用reduce返回false的true。

function balanceParens(string) {
    return !string.split("").reduce((counter, char) => {
        // Handle if parens open and close out of order
        if (counter < 0) { return counter; }
        // Add 1 for each open in order
        if (char === "(") { return ++counter; }
        // subtract 1 for each close in order
        if (char === ")") { return --counter; }
        // handle use case if char is not a paren
        return counter;
    }, 0);
}
console.log(balanceParens("((()))"));

问题

如何使用reduce辅助方法返回括号的最大深度。

3 个答案:

答案 0 :(得分:3)

您可以在减少时保持当前深度和最大深度。

&#13;
&#13;
function maxDepth(string) {
    return string.split("").reduce(({current, max}, char) => {
        // Handle if parens open and close out of order
        if (current < 0) return {current, max}
        // Add 1 for each open in order
        if (char === "(") return { current: current + 1, max: Math.max(max, current + 1)}
        // subtract 1 for each close in order
        if (char === ")") return { current: current - 1, max}
        return {current, max}
    }, {current: 0, max: 0}).max;
}
console.log(maxDepth("(((()))(((())))()(((((()))))))"));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这是一个紧凑版本,当括号不平衡时返回NaN。它使用功能样式的嵌套函数:

function maxDepth(string) {
    return ( ([depth, max]) => depth ? NaN : max )
        ([...string].reduce(([depth, max], ch) => 
            (newDepth => [newDepth, newDepth < 0 ? NaN : Math.max(max, newDepth)])
                 (depth + (ch === "(") - (ch === ")"))
        , [0, 0]));
}
console.log(maxDepth("(((()))(((())))()(((((()))))))"));

答案 2 :(得分:0)

这应该回答它!

function balanceParens(string) {
    let max = 0;
    let res = string.split("").reduce((counter, char) => {
        // Handle if parens open and close out of order
        if (counter < 0) { 
          return counter;
        }
        // Add 1 for each open in order
        if (char === "(") {
          if(++counter > max) {
            max = counter;
          }
          return counter;
        }
        // subtract 1 for each close in order
        if (char === ")") {
          return --counter;
        }
        // handle use case if char is not a paren
        return counter;
    }, 0);
    console.log("Max depth was :", max);
    return !res;
}
console.log(balanceParens("((()(((())))))((((()))))"));