1. 程式人生 > 其它 >LeetCode:682. Baseball Game棒球比賽(C語言)

LeetCode:682. Baseball Game棒球比賽(C語言)

技術標籤:LeetCode

題目描述:
你現在是一場採特殊賽制棒球比賽的記錄員。這場比賽由若干回合組成,過去幾回合的得分可能會影響以後幾回合的得分。

比賽開始時,記錄是空白的。你會得到一個記錄操作的字串列表 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 * 104, 3 * 104]
對於 “+” 操作,題目資料保證記錄此操作時前面總是存在兩個有效的分數
對於 “C” 和 “D” 操作,題目資料保證記錄此操作時前面總是存在一個有效的分數

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/baseball-game
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解答:

int calPoints(char ** ops, int opsSize){
    int i = 0;
    int j = 0;
    int sum = 0;
    int* res=(int *)malloc(sizeof(int) * opsSize);

    for(i = 0;i < opsSize;i++){
        if('C' == ops[i][0]){
            res[j - 1] = 0;
            j--;         
        }
        else if('D' == ops[i][0]){
            res[j] = res[j - 1] * 2;   
            j++;       
        }
        else if('+' == ops[i][0]){
            res[j] = res[j - 2] + res[j - 1];
            j++;
        }
        else{
            res[j] = atoi(ops[i]);
            j++;
        }
    }

    for(i = 0;i < j;i++){
        sum += res[i];
    }

    return sum;
}

執行結果:
在這裡插入圖片描述