计算一个只有乘法和加法的算术表达式的值,乘法优先,时间复杂度为O(N)

输入: 一个字符串, 只有0到9,还有* 和+,保证是合法的.
输出:每个数字后, 打印出当前算术表达式的值
例子:
输入: 1+23*2+3
输出:
1
3
24
47
50

这个题的大体思路就是, 首先要写一个方法, 这个方法能输出任意一个表达式的结果, 然后, 可以通过循环的方式, 将最终表达式的每一项一个一个拼接起来作为这个方法的入参, 方法的思路就是将这个表达式的每一项分割成为一个数组例如, 表达式是’32 + 2 * 62’ , 转化为数组[32, ‘+’, 2, ’ * ', 62], 然后分别判断是否是纯数字表达式或者纯加法表达式还是有乘法项的表达式, 如果有乘法项, 需要考虑连乘项, 然后把所有乘法项的积算出结果, 最后把所有积跟加法项相加

var str = '12+3*2+23*25*6*7+5*3+4*6*2+5'          //输入的表达式
var value = ''                                    //用来拼接表达式的变量
for(var o=0; o<str.length-1; o++) {               //循环遍历表达式
  value+=str[o]                                   //每次循环都拼接一项
  if(str[o]-0>=0) {                               //如果遍历项不为运算符,就执行fn方法
    fn(value)
  }
}



function fn (str) {
  var onlyNum = true                              //判断是否是纯数字的标识符
  var arr = []                                    //用来盛放将str拆分成的数组
  var num = ''                                    //遍历str时, 拼接起来的遍历项
  var hasMult = false                             //判断是否有乘法的标识符
  var mutIndex = []                               //用来存放在arr数组中, 乘号所在的位置
  var result = []                                 //用来存放乘法计算过后的结果集以及不需要计算乘法的数组项
  var resultNum = null                            //用来输出最后的结果的变量
  for(var i = 0;i<str.length;i++) {               //遍历字符串
    if(!(str[i]-0>=0)) {                          //如果遇到不是数字字符的项
      arr.push(num-0,str[i])                      //就把拼接好的字符转成数字, 跟这个运算符一起放进数组
      onlyNum = false                             //将只有数字的标识符置为false
      num = ''                                    //清空num, 为下一循环拼接做准备
      if(str[i] === "*") {                        //如果有乘号
        hasMult = true                            //就将有乘法的标识符置为true
      }
    }else {
      num += str[i]                               //如果遍历项不是运算符, 就将其拼接起来
      if(i === str.length-1) {                    //如果遍历到最后一项
        arr.push(num-0)                           //就将这最后一串字符转成数字置入数组
      }
    }

  }
  if(onlyNum) {                                   //如果表达式中只有数字就直接输出并结束
    console.log(str)
    return
  }
  for(var j=0;j<arr.length;j++) {                 //遍历arr数组
    if(arr[j] === '*') {                          //如果遍历到*号
      mutIndex.push(j)                            //就将其索引放入mutIndex数组中
    }
    if(arr[j-1] !== '*' && arr[j+1] !== '*' && arr[j]-0 >= 0) {
      result.push(arr[j])                         //如果该项是加法项, 就把他放入结果集数组
    }
  }
  if(!hasMult) {                                  //如果表达式中没有乘法
    var resultValue = null                  
    for(var k=0;k<arr.length;k++) {
      if(arr[k]-0>=0) {           
        resultValue += arr[k]                     //就将arr数组的每一项相加并输出结果然后结束
      }
    }
    console.log(resultValue)
    return
  }else {
    var temp = arr[mutIndex[0]-1]                 //定义一个临时变量, 初始值是表达式中乘法的第一项
    for(var v = 0;v<=mutIndex.length-1;v++) {     //遍历mutIndex数组, 获取表达式中所有乘号的位置
      if(mutIndex[v]-mutIndex[v+1] === -2) {      //判断是否是连乘项
        temp *= arr[mutIndex[v]+1]
      }else {
        if(mutIndex[v]-mutIndex[v-1] === 2) {     //判断是否是连乘项中的最后一项
          temp *= arr[mutIndex[v]+1]
          result.push(temp)                       //累乘后将结果置入结果集
        }else {
          temp *= arr[mutIndex[v]+1]              //如果不是连乘项, 就直接两项相乘,将结果置入结果集
          result.push(temp)
        }
        temp = arr[mutIndex[v+1]-1]               //将temp置为下一处乘法的第一项
    
      }
    }
    for(var x = 0; x<result.length; x++) {
      resultNum += result[x]                      //将结果集中的每一项相加后输出
    }
      console.log(resultNum)
  }
}
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IsQtion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值