快手一道前端笔试题:计算表达式中左右括号匹配的对数,以及落单的左括号个数,右括号个数

设一个表达式中只有数字[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;
          }
        }
      }
    }

你可能感兴趣的:(快手一道前端笔试题:计算表达式中左右括号匹配的对数,以及落单的左括号个数,右括号个数)