lynhao / day-by-day

每日更新一道算法题
MIT License
0 stars 0 forks source link

棒球比赛 #11

Open lynhao opened 5 years ago

lynhao commented 5 years ago

题目: 你现在是棒球比赛记录员

给定一个字符串列表,每个字符串可以是以下四种类型之一:

  1. 整数(一轮的得分): 直接表示您在本轮中获得的积分数
  2. "+" (一轮的得分): 表示本轮获得的得分是前两轮有效回合得分的总和
  3. "D" (一轮的得分): 表示本轮获得的得分是前一轮有效回合得分的两倍
  4. "c" ( 一个操作, 这不是一个回合的分数): 表示您获得的最后一个有效回合的分数是无效,应该被移除

每一轮的操作都是永久性的, 可能会对前一轮和后一轮产生影响,你需要返回你在所有回合得分的总和

eg: ["5","2","c","D","+"] output: 30 5 + 2 -2 + 10 + 15 = 30

lynhao commented 5 years ago

解题(进出栈):

function baseball (arr) {
  let result = []

  let pre1 = ''
  let pre2 = ''

  arr.forEach(item => {
    switch(item) {
      case 'D':
        if (result.length > 0) {
          pre1 = result.pop()
          result.push(pre1, pre1 * 2)
        }
        break;
      case '+':
        if (result.length >= 2) {
          let pre1 = result.pop()
          let pre2 = result.pop()
          result.push(pre2, pre1, pre2 + pre1)
        }
        break;
      case 'c':
        if (result.length > 0) {
          result.pop()
        }
        break;
      default: 
        result.push(item * 1)
        break;
    }
  })
  return result.reduce((curr, value) => curr + value) 
}