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

设一个表达式中只有数字[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;
          }
        }
      }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,455评论 0 4
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,107评论 0 3
  • 学习C语言程序设计都会用到高等数学知识和计算机基础理论知识。 使用可变参数应该有以下步骤: 1)首先在函数里定义一...
    皓小天阅读 11,130评论 0 2
  • •1 C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使读者对c语...
    CONLYOUC阅读 12,782评论 9 66
  • 永远不会将就,即使是一个人到老,到死,遇不到合适的他,永远不将就。 真的是遇见好难好难,没关系,时光...
    睡醒没阅读 1,534评论 0 0