掘金团队号上线,助你 Offer 临门! 点击 查看详情
题目描述
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:
整数 x – 表示本回合新获得分数 x
“+” – 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
“D” – 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
“C” – 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
请你返回记录中所有得分的总和。
解题思路
- 首先创建一个栈,用于记录分数;
- 然后遍历整个数组,遇到数字就压入栈;
- 遇到“C”就弹栈
- 遇到“D”就将栈顶元素乘以2,然后将乘积压入栈
- 遇到“+”就将栈顶元素出栈并记录
- 然后将栈顶元素和弹出的值相加,作为新元素
- 将刚刚弹出的元素重新压入栈
- 将新计算出的和压入栈
- 遍历完成后,最终计算栈中元素的和即可
解题代码
var calPoints = function (ops) {
let stack = [];
let len = ops.length;
for (let i = 0; i < len; i++) {
if (ops[i] == 'C') {
stack.pop()
} else if (ops[i] == 'D') {
stack.push(stack[stack.length - 1] * 2);
} else if (ops[i] == '+') {
stack.push(stack[stack.length - 1] + stack[stack.length - 2]);
} else {
stack.push(Number(ops[i]));
}
}
return stack.reduce((a, b) => a + b);
};
复制代码
总结
千里之行,始于足下
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END