有效的括号。给出错误的布尔值(LeetCode 上的 JS 问题)
Valid Parentheses. Gives a wrong boolean (JS problems on LeetCode)
试图在 LeetCode 上解决一个名为“有效括号”的问题。
条件是:
Given a string s containing just the characters '(', ')', '{', '}',
'[' and ']', determine if the input string is valid.
An input string is valid if:
Open brackets must be closed by the same type of brackets. Open
brackets must be closed in the correct order.
我 wrote 一个函数,它在这个片段中工作:
let arr = ['()']
var isValid = function (data) {
let stack = [];
const bracketsArray = {
'{':'}',
'[':']',
'(':')'
}
for (i=0; i < data[0].length; i++) {
if (data[0][i] == '{' || data[0][i] == '(' || data[0][i] == '[') {
stack.push(data[0][i]);
} else if (data[0][i] == '}' || data[0][i] == ']' || data[0][i] == ')') {
if (bracketsArray[stack[stack.length-1]] == data[0][i]) {
stack.pop()
}
}
}
if (stack.length == 0) {
return true
} else {
return false
}
}
console.log(isValid(arr))
函数给出了正确的输出(布尔值)
但是当我出于某种原因 运行 LeetCode 上的这段代码时,相同的代码给了我一个错误的布尔值。
没看懂哪里不对
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let stack = [];
const bracketsArray = {
'{':'}',
'[':']',
'(':')'
}
for (i=0; i < s[0].length; i++) {
if (s[0][i] == '{' || s[0][i] == '(' || s[0][i] == '[') {
stack.push(s[0][i]);
} else if (s[0][i] == '}' || s[0][i] == ']' || s[0][i] == ')') {
if (bracketsArray[stack[stack.length-1]] == s[0][i]) {
stack.pop()
}
}
}
if (stack.length == 0) {
return true;
} else {
return false;
}
};
有什么建议吗?
在 LeetCode 上,函数参数是一个字符串,但在你的测试中,你传递的是一个数组,而且你的函数代码需要一个数组,因为它使用 s[0]
而不是 [=12] 访问字符串=].
无关,但是:
当输入只是一个右括号时,您的代码将失败。这是因为当遇到 non-matching 右括号时,您的循环不会因 return false
而中断。这应该发生在 if (bracketsArray[stack[stack.length-1]] == s[i]) {
的 else
部分
不要使用未声明的变量i
,它会隐式成为一个全局变量(如果运行处于non-strict模式)。
不要将变量命名为 bracketsArray
,因为它不是数组。
更多地使用那个对象,而不是用左括号进行三个比较。
最后的 if...then
对于只返回布尔表达式的值来说有点矫枉过正了。
所以:
var isValid = function(s) {
const stack = [];
const brackets = {
'{':'}',
'[':']',
'(':')'
}
const closing = Object.values(brackets);
for (let ch of s) {
if (brackets[ch]) {
stack.push(brackets[ch]);
} else if (ch == stack.at(-1)) {
stack.pop()
} else if (closing.includes(ch)) {
return false;
}
}
return !stack.length;
};
console.log(isValid("{([])}")); // true
console.log(isValid("]")); // false
您访问迭代的当前字符的方式是错误的。不要做 s[0][i]
,只需做 s[i]
.
s[0][i]
访问第一个字符,然后尝试从中获取 i-th 条目(未定义)。
var isValid = function(s) {
let stack = [];
const bracketsArray = {
'{':'}',
'[':']',
'(':')'
}
for (i=0; i < s.length; i++) {
if (s[i] == '{' || s[i] == '(' || s[i] == '[') {
stack.push(s[i]);
} else if (s[i] == '}' || s[i] == ']' || s[i] == ')') {
if (bracketsArray[stack[stack.length-1]] == s[i]) {
stack.pop()
}
}
}
if (stack.length == 0) {
return true;
} else {
return false;
}
};
isValid("{([])}") // true
isValid("{([)}") // false
试图在 LeetCode 上解决一个名为“有效括号”的问题。
条件是:
Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
An input string is valid if:
Open brackets must be closed by the same type of brackets. Open brackets must be closed in the correct order.
我 wrote 一个函数,它在这个片段中工作:
let arr = ['()']
var isValid = function (data) {
let stack = [];
const bracketsArray = {
'{':'}',
'[':']',
'(':')'
}
for (i=0; i < data[0].length; i++) {
if (data[0][i] == '{' || data[0][i] == '(' || data[0][i] == '[') {
stack.push(data[0][i]);
} else if (data[0][i] == '}' || data[0][i] == ']' || data[0][i] == ')') {
if (bracketsArray[stack[stack.length-1]] == data[0][i]) {
stack.pop()
}
}
}
if (stack.length == 0) {
return true
} else {
return false
}
}
console.log(isValid(arr))
函数给出了正确的输出(布尔值) 但是当我出于某种原因 运行 LeetCode 上的这段代码时,相同的代码给了我一个错误的布尔值。
没看懂哪里不对
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let stack = [];
const bracketsArray = {
'{':'}',
'[':']',
'(':')'
}
for (i=0; i < s[0].length; i++) {
if (s[0][i] == '{' || s[0][i] == '(' || s[0][i] == '[') {
stack.push(s[0][i]);
} else if (s[0][i] == '}' || s[0][i] == ']' || s[0][i] == ')') {
if (bracketsArray[stack[stack.length-1]] == s[0][i]) {
stack.pop()
}
}
}
if (stack.length == 0) {
return true;
} else {
return false;
}
};
有什么建议吗?
在 LeetCode 上,函数参数是一个字符串,但在你的测试中,你传递的是一个数组,而且你的函数代码需要一个数组,因为它使用 s[0]
而不是 [=12] 访问字符串=].
无关,但是:
当输入只是一个右括号时,您的代码将失败。这是因为当遇到 non-matching 右括号时,您的循环不会因
的return false
而中断。这应该发生在if (bracketsArray[stack[stack.length-1]] == s[i]) {
else
部分不要使用未声明的变量
i
,它会隐式成为一个全局变量(如果运行处于non-strict模式)。不要将变量命名为
bracketsArray
,因为它不是数组。更多地使用那个对象,而不是用左括号进行三个比较。
最后的
if...then
对于只返回布尔表达式的值来说有点矫枉过正了。
所以:
var isValid = function(s) {
const stack = [];
const brackets = {
'{':'}',
'[':']',
'(':')'
}
const closing = Object.values(brackets);
for (let ch of s) {
if (brackets[ch]) {
stack.push(brackets[ch]);
} else if (ch == stack.at(-1)) {
stack.pop()
} else if (closing.includes(ch)) {
return false;
}
}
return !stack.length;
};
console.log(isValid("{([])}")); // true
console.log(isValid("]")); // false
您访问迭代的当前字符的方式是错误的。不要做 s[0][i]
,只需做 s[i]
.
s[0][i]
访问第一个字符,然后尝试从中获取 i-th 条目(未定义)。
var isValid = function(s) {
let stack = [];
const bracketsArray = {
'{':'}',
'[':']',
'(':')'
}
for (i=0; i < s.length; i++) {
if (s[i] == '{' || s[i] == '(' || s[i] == '[') {
stack.push(s[i]);
} else if (s[i] == '}' || s[i] == ']' || s[i] == ')') {
if (bracketsArray[stack[stack.length-1]] == s[i]) {
stack.pop()
}
}
}
if (stack.length == 0) {
return true;
} else {
return false;
}
};
isValid("{([])}") // true
isValid("{([)}") // false