计算输入表达式+-*的所有可能计算结果

题目-计算+-*的所有结果

给定一个包含数字和运算符的字符串,计算所有可能组合方式的结果。运算符有三种:+,-,*

所谓的不同组合方式指的是用()来组合。

 比如输入: “2-1-1”.

((2-1)-1) = 0
(2-(1-1)) = 2

输出:[0,2]

分析

再看一个复杂的例子:

输入: “23-45”

(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10

输出: [-34, -14, -10, -10, 10]

一般计算这种运算符操作都会用到递归的方法,因为运算符有固定的模式: a + b , 这种中间固定式运算符,两边是参与运算的数字。

Just Try

请你自动动手试一下:在线编程环境

想想有没有其他思路?

想想时间和空间复杂度,能否优化一下

真的做不到么?

let you think, think makes you happy!

参考答案

想一想逻辑哈,按照操作符来划分,这里面用到一个数组来存储数据。既然是递归,就要想想边界条件

边界条件:

  • 操作符分出来第一个数据时,第一个数据没有操作,就把第一个数据放到数组中。最后的一个字符同样。
  • 计算的部分比较难理解,可先按照一般情况编写,再验证复杂情况
function isOperator(x){
  return x=="+" || x=="-" || x=="*"
}
function compute(str){
  let res = [];
  for(let i=0; i< str.length; i++){
    if(isOperator(str[i])){
      let lnum = compute(str.substr(0,i))
      let rnum = compute(str.substr(i+1,str.length-1))

      lnum.forEach(l=>{
        rnum.forEach(r=>{
          switch(str[i]){
            case "+": res.push(l+r); break;
            case "-": res.push(l-r); break;
            case "*": res.push(l*r); break;
          }
        })
      })
    }
  }
  if(res.length == 0){
    res.push(+str)
  }
  return res;
}
function algorithm(str){
  return compute(str)
}
function main(param) {
  console.show("参数:" + param, "结果:" + JSON.stringify(algorithm(param)))
  testPerformance(algorithm, param)
}
main("2*3-4*5");

请你自动动手试一下:在线编程环境



请遵守《互联网环境法规》文明发言,欢迎讨论问题
扫码反馈

扫一扫,反馈当前页面

咨询反馈
扫码关注
返回顶部