天天看點

682. 棒球比賽 : 簡單模拟題

題目描述

這是 LeetCode 上的 ​​682. 棒球比賽​​ ,難度為 簡單。

Tag : 「模拟」

你現在是一場采用特殊賽制棒球比賽的記錄員。這場比賽由若幹回合組成,過去幾回合的得分可能會影響以後幾回合的得分。

比賽開始時,記錄是空白的。你會得到一個記錄操作的字元串清單 ​

​ops​

​​,其中 是你需要記錄的第 項操作,​​

​ops​

​ 遵循下述規則:

  1. 整數​

    ​x​

    ​​ - 表示本回合新獲得分數​

    ​x​

  2. ​"+"​

    ​ - 表示本回合新獲得的得分是前兩次得分的總和。題目資料保證記錄此操作時前面總是存在兩個有效的分數。
  3. ​"D"​

    ​ - 表示本回合新獲得的得分是前一次得分的兩倍。題目資料保證記錄此操作時前面總是存在一個有效的分數。
  4. ​"C"​

    ​ - 表示前一次得分無效,将其從記錄中移除。題目資料保證記錄此操作時前面總是存在一個有效的分數。

請你傳回記錄中所有得分的總和。

示例 1:

輸入:ops = ["5","2","C","D","+"]

輸出:30

解釋:
"5" - 記錄加 5 ,記錄現在是 [5]
"2" - 記錄加 2 ,記錄現在是 [5, 2]
"C" - 使前一次得分的記錄無效并将其移除,記錄現在是 [5].
"D" - 記錄加 2 * 5 = 10 ,記錄現在是 [5, 10].
"+" - 記錄加 5 + 10 = 15 ,記錄現在是 [5, 10, 15].
所有得分的總和 5 + 10 + 15 = 30      

示例 2:

輸入: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      

示例 3:

輸入:ops = ["1"]

輸出:1      

提示:

  • 為​​

    ​"C"​

    ​​、​

    ​"D"​

    ​​、​

    ​"+"​

    ​​,或者一個表示整數的字元串。整數範圍是
  • 對于​

    ​"+"​

    ​ 操作,題目資料保證記錄此操作時前面總是存在兩個有效的分數
  • 對于​

    ​"C"​

    ​​ 和​

    ​"D"​

    ​ 操作,題目資料保證記錄此操作時前面總是存在一個有效的分數

模拟

根據題意進行模拟即可。

代碼:

class Solution {
    static int[] nums = new int[1010];
    public int calPoints(String[] ops) {
        int n = ops.length, idx = 0;
        for (int i = 0; i < n; i++, idx++) {
            if (ops[i].equals("+")) nums[idx] = nums[idx - 1] + nums[idx - 2];
            else if (ops[i].equals("D")) nums[idx] = nums[idx - 1] * 2;
            else if (ops[i].equals("C")) idx -= 2;
            else nums[idx] = Integer.parseInt(ops[i]);
        }
        int ans = 0;
        for (int i = 0; i < idx; i++) ans += nums[i];
        return ans;
    }
}      
nums = [0 for _ in range(1010)]
class Solution:
    def calPoints(self, ops: List[str]) -> int:
        idx = 0
        for i in range(len(ops)):
            if ops[i] == '+':
                nums[idx] = nums[idx - 1] + nums[idx - 2]
            elif ops[i] == 'D':
                nums[idx] = nums[idx - 1] * 2
            elif ops[i] == 'C':
                idx -= 2
            else:
                nums[idx] = int(ops[i])
            idx += 1
        return sum(nums[i] for i in range(idx))      
  • 時間複雜度:
  • 空間複雜度:

最後

這是我們「刷穿 LeetCode」系列文章的第 ​

​No.682​

​ 篇,系列開始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道題目,部分是有鎖題,我們将先把所有不帶鎖的題目刷完。