iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
自我挑戰組

30天 Leetcode解題之路系列 第 29

Day 29 - Baseball Game

大家好,我是毛毛。ヾ(´∀ ˋ)ノ
廢話不多說開始今天的解題Day~


682. Baseball Game

Question

You are keeping score for a baseball game with strange rules. The game consists of several rounds, where the scores of past rounds may affect future rounds' scores.

At the beginning of the game, you start with an empty record. You are given a list of strings ops, where ops[i] is the ith operation you must apply to the record and is one of the following:

  1. An integer x - Record a new score of x.
  2. "+" - Record a new score that is the sum of the previous two scores. It is guaranteed there will always be two previous scores.
  3. "D" - Record a new score that is double the previous score. It is guaranteed there will always be a previous score.
  4. "C" - Invalidate the previous score, removing it from the record. It is guaranteed there will always be a previous score.

Return the sum of all the scores on the record.


Example

Example1

Input: ops = ["5","2","C","D","+"]
Output: 30
Explanation:
"5" - Add 5 to the record, record is now [5].
"2" - Add 2 to the record, record is now [5, 2].
"C" - Invalidate and remove the previous score, record is now [5].
"D" - Add 2 * 5 = 10 to the record, record is now [5, 10].
"+" - Add 5 + 10 = 15 to the record, record is now [5, 10, 15].
The total sum is 5 + 10 + 15 = 30.

Example2

Input: ops = ["5","-2","4","C","D","9","+","+"]
Output: 27
Explanation:
"5" - Add 5 to the record, record is now [5].
"-2" - Add -2 to the record, record is now [5, -2].
"4" - Add 4 to the record, record is now [5, -2, 4].
"C" - Invalidate and remove the previous score, record is now [5, -2].
"D" - Add 2 * -2 = -4 to the record, record is now [5, -2, -4].
"9" - Add 9 to the record, record is now [5, -2, -4, 9].
"+" - Add -4 + 9 = 5 to the record, record is now [5, -2, -4, 9, 5].
"+" - Add 9 + 5 = 14 to the record, record is now [5, -2, -4, 9, 5, 14].
The total sum is 5 + -2 + -4 + 9 + 5 + 14 = 27.

Example3

Input: ops = ["1"]
Output: 1

Constraints

  • 1 <= ops.length <= 1000
  • ops[i] is "C", "D", "+", or a string representing an integer in the range [-3 * 10^4, 3 * 10^4].
  • For operation "+", there will always be at least two previous scores on the record.
  • For operations "C" and "D", there will always be at least one previous score on the record.

解題

題目

首先先簡單的翻譯一下題目
給一個字串陣列,裏頭含有數字跟指令,數字的話就直接記錄下來;"+"的話,則是把前兩筆記錄下來的數字加總,再記錄成下一筆;"D"的話,則是把前一筆記錄下來的數字乘上2,再記錄成下一筆;"C"的話,則是把前一筆記錄下來的數字刪掉;"+""D""C"執行的時候都會確保前面有足夠的數字可以做運算。最後,回傳記錄下來的陣列的數字總和。

Think

作法大致上是這樣

  • 就照著題目的規則去用if判斷式處理,但是因為isnumeric()只能判斷0~9之間的String,所以多用了一個if來判斷有沒有-號,有的話,把minus_flag設成True,進到記錄數字的判斷式一樣直接記錄下來。
  • 最後回傳記錄陣列的數字總和。

Code

Python

class Solution:
    def calPoints(self, ops: List[str]) -> int:
        record = []
        record_index = 0
        minus_flag = False
        
        for index in range(len(ops)):
            if ops[index][0] == "-":
                minus_flag = True
                
            if ops[index].isnumeric() or minus_flag:
                record.append(int(ops[index]))
                minus_flag = False
                record_index += 1
                
            elif ops[index] == "+":
                record.append((int(record[record_index-2])+int(record[record_index-1])))
                record_index += 1
                
            elif ops[index] == "D":
                record.append((int(record[record_index-1])*2))
                record_index += 1
                
            elif ops[index] == "C":
                record.pop(-1)
                record_index -= 1

        return sum(record)

Result

  • Python

大家明天見/images/emoticon/emoticon29.gif


上一篇
Day 28 - Rotate String
下一篇
Day 30 - Occurrences After Bigram
系列文
30天 Leetcode解題之路30

尚未有邦友留言

立即登入留言