【问题标题】:Expanding use of Javascript array.reduce helper method扩展 JavaScript array.reduce 辅助方法的使用
【发布时间】:2017-07-06 17:58:15
【问题描述】:

背景

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

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

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

问题

我一直在尝试弄明白,这可能是我对 reduce 的工作原理缺乏了解。

示例

这使用reduce返回true或false关于括号是否均匀打开和关闭。

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 辅助方法返回括号的最大深度。

【问题讨论】:

  • 其实reduce是在ES5中引入的……
  • 如果没有reduce,您将如何解决问题?如果您可以发布您的循环代码,我们可以帮助您将其转换为reduce
  • 是的,它是在 es5 中引入的。但是es6以上的课程,这只是他在es6课程中所说的。
  • @Bergi 当我回到家时,我可以发布一个不使用 reduce 的解决方案。但这将是几个小时。
  • 一般来说,当你有符合.reduce()模式的东西但你需要多个值时,你只需使用一个对象作为reduce目标。

标签: javascript ecmascript-6


【解决方案1】:

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

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("(((()))(((())))()(((((()))))))"));

【讨论】:

  • 非常感谢!这很完美现在可以看到我的问题了。伙计,我是如此亲近。
【解决方案2】:

这是一个紧凑的版本,当括号不平衡时返回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("(((()))(((())))()(((((()))))))"));

【讨论】:

    【解决方案3】:

    这应该回答它!

    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("((()(((())))))((((()))))"));

    【讨论】:

    • 什么意思? const 变量在哪里?
    • 我喜欢这个答案。它似乎更符合问题示例。
    • @AftabKhan 专门针对max
    • @Arrow 不知道你所说的“一致”是什么意思
    • 问了一个问题here如果有人有兴趣给出详细的答案
    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多