你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
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
};
让我们在处理数据时保持栈上每个有效回合的值 栈是理想的,因为我们只处理涉及最后或倒数第二轮的操作