提问人:Muxa 提问时间:1/7/2023 最后编辑:Muxa 更新时间:1/14/2023 访问量:44
如果给定的序列有效,则以下函数必须返回 true。为什么此函数不为“||”序列返回 true?
Following function must return true if given sequence is valid. Why this function doesn't return true for "||" sequence?
问:
函数必须为“()”序列返回 true,为“[)”序列返回 false,因此它确实如此。但是为什么这个函数不对“||”序列返回 true?你能帮忙吗?
我写了这段代码,但没有任何效果:(
function check(s) {
const brackets = {
")": "(",
"]": "[",
"}": "{",
"|": "|",
};
const st = [];
for (let i = 0; i < s.length; i++) {
if (isClosedBracket(s[i])) {
if (brackets[s[i]].toString() !== st.pop()) {
return false;
}
} else {
st.push(s[i]);
}
}
return st.length === 0;
}
//if bracket is in this array, function returns true, so bracket is closing
function isClosedBracket(ch) {
return [")", "]", "}", "|"].indexOf(ch) > -1;
}
答:
0赞
MichiBros
1/7/2023
#1
好吧,由于管道序列“||”使用相同的字符来打开和关闭,那么当第一个 |(开头的那个)将遇到,将执行右括号的代码块。
您的代码可以正常工作,但如果开始字符与结束字符相同,则代码将无法正常运行。如果您绝对需要此功能,请考虑在此特定情况下添加更多检查。
但是,代码会变得更加复杂,因为单数 |也可能意味着错误序列中的右括号,因此像“(|)”这样的输入处理起来会有点复杂。
0赞
Muxa
1/14/2023
#2
谢谢大家!我通过添加另一个 if/else 块解决了这个问题。这是解决方案,如果你需要它=3
function check(str) {
let stack = [];
for (let i = 0; i < str.length; i++) {
if (
+str[i] === 1 ||
+str[i] === 3 ||
+str[i] === 5 ||
str[i] === "(" ||
str[i] === "[" ||
str[i] === "{"
) {
stack.push(str[i]);
} else if (
(+str[i] === 2 && stack.at(-1) === "1") ||
(+str[i] === 4 && stack.at(-1) === "3") ||
(+str[i] === 6 && stack.at(-1) === "5") ||
(str[i] === ")" && stack.at(-1) === "(") ||
(str[i] === "]" && stack.at(-1) === "[") ||
(str[i] === "}" && stack.at(-1) === "{")
) {
stack.pop();
} else if (str[i] !== stack.at(-1)) {
stack.push(str[i]);
} else {
stack.pop();
}
}
return !stack.length > 0;
}
有什么想法如何改进这个代码吗?
评论
|
没有方向......