任何人都可以解释为什么我在这个 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)
})
};
- 您输入“()”
- 输出未定义
- 预期为真
感谢您的帮助。
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
};
再次返回另一个 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)
})
};
- 您输入“()”
- 输出未定义
- 预期为真
感谢您的帮助。
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
};