สมมติว่าเรามีรายการสตริงชื่อ orders แต่ละสมาชิกเริ่มต้นด้วย "P" หรือ "D" โดย "P" หมายถึงรับออเดอร์ (pickup) และ "D" หมายถึงส่งมอบ (delivery) ตัวอักษรตามด้วยหมายเลขออเดอร์ เช่น "P6" แสดงรับออเดอร์ 6 เราต้องตรวจสอบว่า orders ถูกต้องตามกฎ:
- ไม่สามารถส่งมอบออเดอร์ก่อนรับได้
- ทุกการรับต้องมีการส่งมอบ
- ออเดอร์ที่รับและส่งมอบแล้ว ไม่สามารถรับหรือส่งซ้ำได้
เช่น ถ้าอินพุตคือ orders = ["P1", "D1", "P2", "P3", "D3", "D2"] ผลลัพธ์จะเป็น True เพราะออเดอร์แรกส่งหลังรับ และออเดอร์ที่ 2-3 รับพร้อมกันและส่งมอบทีหลัง
ขั้นตอนการแก้ปัญหา
a := แมปใหม่- ถ้า
ordersมีรายการซ้ำ คืนค่าFalse - สำหรับแต่ละ
iในorders:- ถ้า
iเริ่มด้วย"P"ให้a[หมายเลขออเดอร์] = 1 - มิฉะนั้นถ้า
iเริ่มด้วย"D":- ถ้า
หมายเลขออเดอร์ไม่อยู่ในaคืนค่าFalse - มิฉะนั้น
a[หมายเลขออเดอร์] -= 1
- ถ้า
- ถ้า
- คืนค่า
Trueถ้าsum(a.values()) == 0มิฉะนั้นFalse
ตัวอย่างการใช้งาน
def solve(orders):
a = {}
if len(set(orders)) != len(orders):
return False
for i in orders:
if i[0] == "P":
a[i[1:]] = 1
elif i[0] == "D":
if i[1:] not in a:
return False
else:
a[i[1:]] -= 1
return sum(a.values()) == 0
orders = ["P1", "D1", "P2", "P3", "D3", "D2"]
print(solve(orders))
อินพุต
["P1", "D1", "P2", "P3", "D3", "D2"]
เอาต์พุต
True