2021/03/10 每日一题 基本计算器

LeetCode上基本计算器,困难难度,记录下解题思路

传入一个字符串s,s是一个只包含加减和括号的运算式,要求计算这个运算式的结果

从左到右遍历整个字符串其实可以分为五种情况

  1. 当前元素是+
  2. 当前元素是 -
  3. 当前元素是 (
  4. 当前元素是 )
  5. 当前元素是数字

需要针对不同的情况来进行操作
用一个标识符来表示当前数字前面的加减号,例如1-1,可以理解为1 + -1,那么加减情况就会转换为1*1 + -1*1
所以当元素元素是+的时候标志位设为1,如果元素是-标志位设为-1
当遇到括号的时候例如1-(1+2)的时候,从左到右遍历
第一位是1,直接加入res = 1
第二位是-,此时sign = -1
第三位是(,将之前的sign放入栈,此时栈ops = [1,-1]
第四位是1,直接加入res = 1 + 1*-1
第五位是+,获取ops = [1,-1]的最后一位,此时sign = -1
第六位是1,此时sign = -1,所以是res = 0 + 2*sign = -2
第七位),出栈此时栈ops = [1]
这样相当于把括号去掉了运算1-1-2

var calculate = function(s) {
  let sign = 1
  // 符号栈
  let ops = [1]
  // 当前的位置
  let i = 0
  // 返回的结果
  let res = 0
  // 1 + ( 1 + 1 ) + -2 + 1
  while(i<s.length) {
    if(s[i] === '+'){
      // 加号情况  
      sign = ops[ops.length-1]
    }else if(s[i] === '-'){
      // 减号情况 
      sign = -ops[ops.length-1]
    }else if(s[i] === '(') {
      // 左括号情况   
      ops.push(sign)
    }else if(s[i] === ')') {
      // 右括号情况 
      ops.pop()
    }else if(s[i] === ' ') {
      // 空格情况
      i++
      continue
    } else {
      // 排除上面所有情况,是数字  
      let num = '';
      // 这里排除被空格分开的数字的情况,;例如11写成了1 1
      while (i < s.length && !(isNaN(Number(s[i])))) {
          num+=s[i]
          i++;
      }
      i--
      // 计算当前的结果
      res += sign * Number(num);
    }
    // 后移一位
    i++
  }
  // 返回结果
  return res
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容