题目

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:
"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5

大致意思

给你一段字符串,仅包含 非负数、加减乘除符号和空格。求出最后的运算的结果。

解决方案

  • 分为两步,先算乘除,后算加减
  • 乘除算法
    • 循环进行正则匹配,挨个把乘除结果计算出来,然后进行replace替换。
    • 这样就会得到一个只有数字和加减符号的表达式
s = s.replace(/\s/g, ''); // 去除空格
var reg = /(\d+)(\/|\*)(\d+)/;
var result = s.match(reg);
while (result) {
  pattern = result[2];
  leftDigtial = Number(result[1]);
  rightDigtial = Number(result[3]);
  if (pattern === '*') {
    res = leftDigtial * rightDigtial;
  } else {
    res = Math.floor(leftDigtial / rightDigtial);
  }
  s = s.replace(result[0], res);
  result.lastIndex = 0;
  result = s.match(reg);
}
  • 加减运算
    • 进行正则匹配,取出所有的数字以及加减符号。
    • 让和先等于数字的第一个
    • 依次遍历加减符号的数组,挨个进行加减运算
var digitalArray = s.match(/\d+/g); // 数字
var patternArray = s.match(/[\-|\+]/g); // 加减符号
var count = Number(digitalArray[0]);
if (!patternArray) return count; // 如果不存在符号,直接return

patternArray.forEach((pattern, i) => {
  leftDigtial = Number(digitalArray[i + 1]);
  if (pattern === '+') {
    count += leftDigtial
  } else {
    count -= leftDigtial;
  }
});

源代码

var calculate = function(s) {
  var leftDigtial;
  var rightDigtial;
  var pattern;

  s = s.replace(/\s/g, ''); // 去除空格
  var reg = /(\d+)(\/|\*)(\d+)/;
  var result = s.match(reg);
  while (result) {
    pattern = result[2];
    leftDigtial = Number(result[1]);
    rightDigtial = Number(result[3]);
    if (pattern === '*') {
      res = leftDigtial * rightDigtial;
    } else {
      res = Math.floor(leftDigtial / rightDigtial);
    }
    s = s.replace(result[0], res);
    result.lastIndex = 0;
    result = s.match(reg);
  }

  var digitalArray = s.match(/\d+/g); // 数字
  var patternArray = s.match(/[\-|\+]/g); // 加减符号
  var count = Number(digitalArray[0]);
  if (!patternArray) return count; // 如果不存在符号,直接return

  patternArray.forEach((pattern, i) => {
    leftDigtial = Number(digitalArray[i + 1]);
    if (pattern === '+') {
      count += leftDigtial
    } else {
      count -= leftDigtial;
    }
  });

  return count;
};