สมมติว่าเรามีเครื่องบันทึกแต้มเกมเบสบอล เรามีรายการสตริง แต่ละสตริงสามารถเป็นหนึ่งใน 4 ประเภทต่อไปนี้ -
- จำนวนเต็ม (คะแนนของรอบเดียว) − ระบุจำนวนคะแนนที่เราได้รับในรอบนี้
- "+" (คะแนนของรอบเดียว) − ระบุว่าคะแนนที่เราได้รับในรอบนี้คือผลรวมของคะแนนสองคะแนนในรอบสุดท้ายที่ใช้ได้
- "D" (คะแนนของรอบเดียว) − ระบุว่าคะแนนที่เราได้รับในรอบนี้เป็นข้อมูลสองเท่าของคะแนนในรอบสุดท้ายที่ใช้ได้
- "C" (การดำเนินการซึ่งไม่ใช่คะแนนของรอบ) − ระบุว่าคะแนนของรอบสุดท้ายที่ถูกต้องที่เราได้รับนั้นไม่ถูกต้องและควรถูกลบออก
โปรดทราบว่าการดำเนินการของแต่ละรอบเป็นแบบถาวรและอาจมีผลกระทบต่อรอบก่อนและรอบหลัง เราต้องหาผลรวมของแต้มที่จะได้ในทุกรอบ
ดังนั้น หากอินพุตเป็น ["5","2","C","D","+"] เอาต์พุตจะเป็น 30 ซึ่งจริงๆ แล้วสำหรับ
- รอบที่ 1 – เราจะได้ 5 คะแนน ผลรวมคือ:5.
- รอบที่ 2 – เราจะได้ 2 คะแนน ผลรวมคือ:7.
- ปฏิบัติการ 1 − ข้อมูลของรอบที่ 2 ไม่ถูกต้อง ผลรวมคือ:5.
- รอบที่ 3 – เราจะได้ 10 แต้ม ผลรวมคือ:15.
- รอบที่ 4 – เราจะได้ 5 + 10 =15 แต้ม ผลรวมคือ 30.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- stack :=รายการว่าง
- สำหรับแต่ละคนใน ops ทำ
- ถ้าฉันเหมือนกับ "+" แล้ว
- แรก :=กอง[ขนาดของกอง - 1] วินาที :=กอง[ขนาดของกอง - 2]
- แทรก (แรก + วินาที) ลงในสแต็กในตอนท้าย
- มิฉะนั้น เมื่อ i เหมือนกับ "D" แล้ว
- แทรก (องค์ประกอบสุดท้ายของ stack * 2) ลงใน stack ในตอนท้าย
- มิฉะนั้น เมื่อ i เหมือนกับ "C" แล้ว
- ลบองค์ประกอบสุดท้ายออกจากสแต็ก
- มิฉะนั้น
- ใส่ i ลงใน stack ตอนท้าย
- ถ้าฉันเหมือนกับ "+" แล้ว
- ส่งคืนผลรวมขององค์ประกอบทั้งหมดของสแต็ก
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
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","+"]))
อินพุต
["5","2","C","D","+"]
ผลลัพธ์
30