Giả sử ta có một bộ ghi điểm trò chơi bóng chày. Ta có một danh sách các chuỗi; mỗi chuỗi có thể là một trong 4 loại sau:
- Số nguyên (điểm một vòng) - Chỉ số điểm ta đạt được trong vòng này.
- "+" (điểm một vòng) - Chỉ điểm vòng này là tổng điểm của hai vòng hợp lệ trước đó.
- "D" (điểm một vòng) - Chỉ điểm vòng này là gấp đôi điểm của vòng hợp lệ trước đó.
- "C" (một phép toán, không phải điểm vòng) - Chỉ điểm của vòng hợp lệ trước đó là vô hiệu và nên bị xóa.
Lưu ý rằng mỗi phép toán của vòng là vĩnh viễn và có thể ảnh hưởng đến vòng trước và vòng sau. Ta cần tìm tổng điểm ta có thể đạt được trong tất cả các vòng.
Ví dụ, nếu đầu vào là ["5","2","C","D","+"], thì đầu ra sẽ là 30. Thực tế đây là cho:
- Vòng 1 - Ta đạt 5 điểm. Tổng: 5.
- Vòng 2 - Ta đạt 2 điểm. Tổng: 7.
- Phép toán 1 - Dữ liệu vòng 2 vô hiệu. Tổng: 5.
- Vòng 3 - Ta đạt 10 điểm. Tổng: 15.
- Vòng 4 - Ta đạt 5 + 10 = 15 điểm. Tổng: 30.
Để giải quyết, ta thực hiện các bước sau:
- stack := danh sách rỗng
- Với mỗi i trong ops, thực hiện:
- Nếu i bằng "+", thì:
- first := stack[kích thước stack - 1], second := stack[kích thước stack - 2]
- Thêm (first + second) vào cuối stack
- Ngược lại, nếu i bằng "D", thì:
- Thêm (phần tử cuối stack * 2) vào cuối stack
- Ngược lại, nếu i bằng "C", thì:
- Xóa phần tử cuối khỏi stack
- Ngược lại:
- Thêm i vào cuối stack
- Nếu i bằng "+", thì:
- Trả về tổng tất cả phần tử của stack
Hãy xem triển khai sau để hiểu rõ hơn:
Ví dụ
class Solution: def calPoints(self, ops): stack = [] for i in ops: if i == "+": first, second = stack[len(stack) - 1], stack[len(stack) - 2] stack.append(first + second) elif i == "D": stack.append(stack[-1] * 2) elif i == "C": stack.pop() else: stack.append(int(i)) return sum(stack) ob = Solution() print(ob.calPoints(["5","2","C","D","+"]))
Đầu vào
["5","2","C","D","+"]
Đầu ra
30