LeetCode算法之棒球比赛

183 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第30天,点击查看活动详情

🎉前言

为什么要学习算法?因为 「程序=数据结构+算法」 ,这是在面向过程的编程语言年代备受推崇的一句话,拥有良好的算法基础才能在人群之中脱颖而出。人们设计各种算法的目的是解决现实问题,所以学好算法才能站在一个更高维度来看待问题。

⚾️ ​什么是棒球比赛

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

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

  1. 整数 x - 表示本回合新获得分数 x
  2. "+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
  3. "D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
  4. "C" - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
  5. 请你返回记录中所有得分的总和。
// 示例
输入:ops = ["5","-2","4","C","D","9","+","+"]
输出:27
解释:
"5" - 记录加 5 ,记录现在是 [5]
"-2" - 记录加 -2 ,记录现在是 [5, -2]
"4" - 记录加 4 ,记录现在是 [5, -2, 4]
"C" - 使前一次得分的记录无效并将其移除,记录现在是 [5, -2]
"D" - 记录加 2 * -2 = -4 ,记录现在是 [5, -2, -4]
"9" - 记录加 9 ,记录现在是 [5, -2, -4, 9]
"+" - 记录加 -4 + 9 = 5 ,记录现在是 [5, -2, -4, 9, 5]
"+" - 记录加 9 + 5 = 14 ,记录现在是 [5, -2, -4, 9, 5, 14]
所有得分的总和 5 + -2 + -4 + 9 + 5 + 14 = 27

❓ 比赛侧写

从上述示例中,我们可以获得以下知识点:

  1. 如果是 C ,移除数组最后一位元素。
  2. 如果是 D,前一个分数的双倍并插入到数组中。
  3. 如果是 +,前两个分数的总和并插入到数组中。
  4. 如果是 number (number有正数和负数),插入到数组中。

👀 ​代码实现

let calPoints = function(ops) {
    // 定义变量数组,保存结果
​
    // 遍历 ops
    
    //  每次循环都获取一次resultArr的长度,因为resultArr每一轮循环都在变
       
    // 如果是 C ,弹出数组的最后一位
       
    // 如果是 D ,前一个分数的双倍并插入到数组中
​
    // 如果是 + ,前两个分数的总和并插入到数组中
       
    // 如果是number,插入到数组中
  
    // 返回累加求和
​
}

先把思路用伪代码的形式写出来,这样的好处多多哦,希望大家可以有这样的习惯~~

具体代码实现:

let calPoints = function(ops) {
    // 定义变量数组,保存结果
    let resultArr = [];
    // 遍历 ops
    for (let i = 0; i < ops.length; i++) {
​
        //  每次循环都获取一次resultArr的长度,因为resultArr每一轮循环都在变
        const k = resultArr.length;
​
        // 如果是 C ,弹出数组的最后一位
        if (ops[i] === 'C') {
            resultArr.pop();
        }
​
        // 如果是 D ,前一个分数的双倍并插入到数组中
        else if (ops[i] === 'D') {
            resultArr.push(resultArr[k-1] * 2);
        }
​
        // 如果是 + ,前两个分数的总和并插入到数组中
        else if (ops[i] === '+') {
            resultArr.push(resultArr[k-1] + resultArr[k-2]);
        }
​
        // 如果是number,插入到数组中
        else if(Number(ops[i]) !== NaN) {
            resultArr.push(Number(ops[i]));
        }
    }
​
    // 返回累加求和
    return resultArr.reduce((total, curVal) => {
        return total + curVal;
    })
​
}

代码测试:

const ops = ["5","-2","4","C","D","9","+","+"];
console.log(calPoints(ops)); // 27

✨总结

以上就是本次分享的全部内容~~

如果觉得文章写得不错,对你有所启发的,请不要吝啬 点个 关注 并在 评论区 留下你宝贵的意见哦~~😃