louzhedong / blog

前端基础,深入以及算法数据结构

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

基本计算器 II

louzhedong opened this issue · comments

习题

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例 1:

输入:s = "3+2*2"
输出:7
示例 2:

输入:s = " 3/2 "
输出:1
示例 3:

输入:s = " 3+5 / 2 "
输出:5

提示:

1 <= s.length <= 3 * 105
s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数

思路

用栈来保存之前的操作符,先处理乘法和除法,再处理加法和减法

解答

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function (s) {
  s = removeSpace(s);
  var stack = [],
    len = s.length,
    i = 0,
    j = 1;
  for (; i < len; i++) {
    var current = s[i];
    if (current == ' ') {
      continue;
    } else if (current == '/') {
      var divisor = stack.pop();
      stack.push(Math.floor(Number(divisor) / Number(s[i + 1])));
      i++;
    } else if (current == '*') {
      var multiplier = stack.pop();
      stack.push(Number(multiplier) * Number(s[i + 1]));
      i++;
    } else {
      stack.push(current);
    }
  }
  var result = Number(stack[0]);
  for (; j < stack.length; j++) {
    if (stack[j] == '+') {
      result += Number(stack[j + 1]);
      j++;
    } else if (stack[j] == '-') {
      result -= Number(stack[j + 1]);
      j++;
    }
  }
  return result;
};

var removeSpace = function (s) {
  var res = [];
  var currentNumber = '';
  for (var i = 0; i < s.length; i++) {
    var current = s[i];
    if (current != ' ') {
      if (
        current == '+' ||
        current == '-' ||
        current == '*' ||
        current == '/'
      ) {
        res.push(current);
      } else {
        if (currentNumber) {
          current = Number(currentNumber) * 10 + Number(current);
        }
        if ((i + 1) < s.length && !isNaN(s[i + 1]) && s[i + 1] != ' ') {
          currentNumber = current;
        } else if ((i + 1) < s.length && isNaN(s[i + 1]) && s[i + 1] != ' ') {
          res.push(current);
          currentNumber = '';
        } else {
          res.push(current);
        }
      }
    }
  }
  return res;
};