你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
1.整数(一轮的得分):直接表示您在本轮中获得的积分数。
2. "+"(一轮的得分):表示本轮获得的得分是前两轮有效 回合得分的总和。
3. "D"(一轮的得分):表示本轮获得的得分是前一轮有效 回合得分的两倍。
4. "C"(一个操作,这不是一个回合的分数):表示您获得的最后一个有效 回合的分数是无效的,应该被移除。

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

示例 1:

输入: ["5","2","C","D","+"]
输出: 30
解释: 
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到2分。总和是:7。
操作1:第2轮的数据无效。总和是:5。
第3轮:你可以得到10分(第2轮的数据已被删除)。总数是:15。
第4轮:你可以得到5 + 10 = 15分。总数是:30。
示例 2:

输入: ["5","-2","4","C","D","9","+","+"]
输出: 27
解释: 
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到-2分。总数是:3。
第3轮:你可以得到4分。总和是:7。
操作1:第3轮的数据无效。总数是:3。
第4轮:你可以得到-4分(第三轮的数据已被删除)。总和是:-1。
第5轮:你可以得到9分。总数是:8。
第6轮:你可以得到-4 + 9 = 5分。总数是13。
第7轮:你可以得到9 + 5 = 14分。总数是27。
注意:

输入列表的大小将介于1和1000之间。
列表中的每个整数都将介于-30000和30000之间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/baseball-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 

var calPoints = function(ops) {
  let arr = [];
  let opera = {
    "+": function() {
      let total = arr.length > 1 ? Number(arr[arr.length - 1]) + Number(arr[arr.length -2]): arr[0];
      arr.push(total);
    },
    "D": function() {
      arr.length && arr.push(arr[arr.length - 1] * 2)
    },
    "C": function() {
      arr.pop();
    },
    'in': function(item) {
      arr.push(item);
    }
  };

  ops.forEach((item) => {
    if (item in opera) {
      opera[item]();
    } else {
      opera.in(item);
    }
  })

  return arr.reduce((total, num) =>  Number(total) + Number(num))

};

var calPoints = function(ops) {
    var result = 0
    var logs = []
    // 记录每轮得的分数
    for(var i = 0;  i< ops.length; i++ ) {
        if ( ops[i] == 'C') {
            logs[i] = {val: '', v: false}
            var  vailable = i -1
           
            while(logs[vailable].v == false) {
                vailable --
            }
            result+= (logs[vailable].val*-1)
            
            logs[vailable] = {val: logs[vailable].val, v: false}
           
            // console.log('(logs[vailable]*-1)',vailable, logs, (logs[vailable].val*-1),result)
        } else if (ops[i] == 'D') {
            var  vailable = i -1
            console.log('logs',logs,vailable, logs[vailable])
            while(logs[vailable].v == false) {
                vailable --
            }
            // console.log('vailable',vailable)
            // console.log('(logs[vailable]*2)',(logs[vailable]).val )
            result+= (logs[vailable].val*2)
          
            logs[i] = {val: logs[vailable].val*2, v: true}
            // console.log('result',result)
        } else if (ops[i] == '+') {
            var  vailable = i - 1
            console.log('logs', logs, vailable)
            let one = 0
            let two = 0
            console.log('logs[vailable]',i, logs[vailable])
            while(logs[vailable].v == false) {
                vailable --
            }
           
            one = logs[vailable].val
            console.log('one', one)
            vailable --
            // console.log(logs,logs[vailable])
            while(logs[vailable].v == false) {
                vailable --
            }
            two = logs[vailable].val
            result+= (one + two)
            logs[i] = {val: (one + two), v: true}
            // console.log('result',result)
        }else {
            result += Number((ops[i]))
            logs[i] = {val: Number(ops[i]), v: true}
        }
    }
    return result
};

让我们在处理数据时保持栈上每个有效回合的值    栈是理想的,因为我们只处理涉及最后或倒数第二轮的操作