任何人都可以解释为什么我在这个 leetcode 问题上得到未定义的输出吗?

Can any one explain why i am getting undefined output on this leetcode problem?

再次返回另一个 leetcode 问题。我无法让我的函数或我的每个循环得到 return 一个值,当我这样做时它仍然显示为未定义

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
   
  let  opposingParens = {
    "(" : ")",
    "[" : "]",
    "{" : "}"
  }
  let splitChars = s.split('');
   
  let isTruthy = false
  let opposingParensFunc = (paren) => {
      
    if(splitChars[1] == opposingParens[paren] || splitChars[splitChars.length -1] == opposingParens[paren]) {
      isTruthy = true
    }
    return isTruthy
  }
   
       
  splitChars.forEach((char,i) => {
    return opposingParensFunc(char)
  })
};
  1. 您输入“()”
  2. 输出未定义
  3. 预期为真

感谢您的帮助。

var isValid = function(s) {

let  opposingParens = {
    "(" : ")",
    "[" : "]",
    "{" : "}"
}
let  splitChars = s.split('');

let isTruthy = false
let opposingParensFunc = (paren) => {
  
   if(splitChars[1] === opposingParens[paren] || splitChars[splitChars.length -1] === opposingParens[paren]  ){
    isTruthy = true
}
   return isTruthy
}
splitChars.forEach((char,i) =>{
    console.log(opposingParensFunc(char))
})  
};
isValid("()")

就像之前在评论中所说的那样,forEach() returns 未定义,这里的预期答案是 2,因为 forEach() 是 运行 两次。

您的函数没有 return 语句。您所拥有的是为另一个函数提供 return 值:您提供给 forEach 的函数。但这并不能确定 main 函数的 return 值。看起来您想在 任何回调函数之外执行以下操作:

return isThruthy;

注意:在 forEach 回调中提供 return 值是无用的,它永远不会使用该值。

但是,您的算法在一般情况下不起作用,因为您总是将一个字符与索引 1 处的字符以及输入中的最后一个字符进行比较。但请注意,平衡右括号可以在输入中的任何位置。想想“([]){}”。

你真正需要的是堆栈。当您找到左括号,但它的右括号在堆栈上时,这表明您希望在此左括号的 right 某处找到什么。如果还有另一个左括号,那么应该先关闭那个,所以我们也将相应的右括号压入堆栈,...等等

找到右括号后,将其与堆栈顶部的括号进行比较。如果它们不同,则输入无效。如果相等,则您有一个平衡对,并且可以从堆栈中弹出该信息,...等等

当您到达输入的末尾时,您还必须确保不再有预期的右括号。换句话说,那一刻堆栈应该是空的。

这是一个实现:

let brackets = {
    "(": ")",
    "[": "]",
    "{": "}",
};

var isValid = function(s) {
    let stack = [];
    for (let i = 0; i < s.length; i++) {
        let ch = s[i];
        let open = brackets[ch];
        if (open) stack.push(open);
        else if (ch !== stack.pop()) return false;
    }
    return !stack.length; // true when stack is empty, false otherwise
};