[LeetCode-682棒球比赛] | 刷题打卡

掘金团队号上线,助你 Offer 临门! 点击 查看详情

题目描述

你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。

比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:

整数 x – 表示本回合新获得分数 x
“+” – 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
“D” – 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
“C” – 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
请你返回记录中所有得分的总和。

解题思路

  1. 首先创建一个栈,用于记录分数;
  2. 然后遍历整个数组,遇到数字就压入栈;
  3. 遇到“C”就弹栈
  4. 遇到“D”就将栈顶元素乘以2,然后将乘积压入栈
  5. 遇到“+”就将栈顶元素出栈并记录
  6. 然后将栈顶元素和弹出的值相加,作为新元素
  7. 将刚刚弹出的元素重新压入栈
  8. 将新计算出的和压入栈
  9. 遍历完成后,最终计算栈中元素的和即可

解题代码

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
喜欢就支持一下吧
点赞0 分享