Go語言LeetCode題解682棒球比賽
題目描述
682. 棒球比賽
你現在是一場采用特殊賽制棒球比賽的記錄員。這場比賽由若幹回合組成,過去幾回合的得分可能會影響以後幾回合的得分。
比賽開始時,記錄是空白的。你會得到一個記錄操作的字符串列表 ops,其中 ops[i] 是你需要記錄的第 i 項操作,ops 遵循下述規則:
- 整數 x – 表示本回合新獲得分數 x
- "+" – 表示本回合新獲得的得分是前兩次得分的總和。題目數據保證記錄此操作時前面總是存在兩個有效的分數。
- "D" – 表示本回合新獲得的得分是前一次得分的兩倍。題目數據保證記錄此操作時前面總是存在一個有效的分數。
- "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
提示:
- 1 <= ops.length <= 1000
- ops[i] 為 "C"、"D"、"+",或者一個表示整數的字符串。整數范圍是 [-3 * 10^4, 3 * 10^4]
- 對於 "+" 操作,題目數據保證記錄此操作時前面總是存在兩個有效的分數
- 對於 "C" 和 "D" 操作,題目數據保證記錄此操作時前面總是存在一個有效的分數
思路分析
采用棧的方法,初始化一個空棧stack_i,每次從字符串中拿出一個字符,第一個字符都為數字,將當前字符壓入棧底
若字符中取到C的話,表示將當前棧頂的元素取出,若字符為D的話,表示將當前棧頂元素的值乘以2倍,得出新的值不需要
替換棧頂的值,因為每一步操作都是獨立的,都是生成一個獨立的值,所以需要將生成的值放入棧頂,如取出的字符為+,則表示將
當前棧頂的值和棧頂下面的那個值相加生成一個新的值,新的值也是獨立操作得出來的,所以需要壓入棧頂,最後將棧中的值每個元素
相加即得到最後的答案
AC 代碼
class Solution: def calPoints(self, ops: List[str]) -> int: stack_i = [] for i in ops: if i == 'C': stack_i.pop() elif i == 'D': stack_i.append(int(stack_i[-1])*2) elif i == '+': stack_i.append(int(stack_i[-1])+ int(stack_i[-2])) else: stack_i.append(int(i)) return(sum(stack_i))
以上就是Go語言LeetCode題解682棒球比賽的詳細內容,更多關於Go語言題解棒球比賽的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Go語言題解LeetCode599兩個列表的最小索引總和
- C++實現LeetCode(114.將二叉樹展開成鏈表)
- go語言題解LeetCode674最長連續遞增序列
- C++實現LeetCode(155.最小棧)
- C++實現LeetCode(203.移除鏈表元素)