设一个表达式中只有数字[0 - 9]、基本运算符[ +, -, *, / ]、括号[ (, ) ]。计算表达式中左右括号匹配的对数,以及落单的左括号个数,右括号个数
例:
输入:"1*2+(3+3)())))(((("
输出:2 4 3
(三个结果空格隔开)
以下为我个人的答案
let str = "1*2+(3+3)())))((((";
console.log(getNum(str)); // 2 4 3
function getNum(str) {
let count = 0, // 括号匹配对数
left = 0, // 落单左括号个数
right = 0, // 落单右括号个数
arr = [];
arr = Array.from(str);
arr = arr.filter(v => v == "(" || v == ")"); // 获得括号数组
return getRes(count, left, right, arr);
function getRes(count, left, right, newArr) {
if (!newArr.length) return count + " " + left + " " + right;
if (newArr[0] == ")") { // 如果括号数组第一个元素为右括号,则直接删除并记录落单右括号个数
right++;
newArr.splice(0, 1);
return getRes(count, left, right, newArr);
} else { // 如果第一个元素为左括号
let i = newArr.findIndex(v => v == ")");
if (~i) {// 若匹配到对应的右括号,则记录并删除
count++;
newArr.splice(i, 1);
newArr.splice(0, 1);
return getRes(count, left, right, newArr);
} else { // 若没有匹配到对应的右括号 则剩下的全部为落单左括号
left = newArr.length;
return count + " " + left + " " + right;
}
}
}
}