สมมติว่าเรามีรายการสตริงที่เรียกว่าคำสั่ง แต่ละองค์ประกอบในรายการคำสั่งซื้อเริ่มต้นด้วย "P" หรือ "D" "P" หมายถึงหยิบขึ้นมา และ "D" หมายถึง "จัดส่ง" และตัวอักษรเหล่านี้ตามด้วยหมายเลขรหัสคำสั่งซื้อ ตัวอย่างเช่น "P6" หมายถึงการรับสินค้าที่ 6 เราต้องตรวจสอบว่ารายการคำสั่งซื้อถูกต้องหรือไม่ตามกฎเหล่านี้ -
- เราไม่สามารถจัดส่งคำสั่งซื้อก่อนรับสินค้าได้
- ต้องส่งทุกรถกระบะ
- คำสั่งซื้อที่รับแล้วและจัดส่งแล้วจะไม่สามารถรับหรือจัดส่งได้อีก
ดังนั้น หากอินพุตเหมือนกับคำสั่งซื้อ =["P1", "D1", "P2", "P3", "D3", "D2"] ผลลัพธ์จะเป็น True เนื่องจากคำสั่งซื้อแรกจะถูกส่งหลังจากรับ และสำหรับการสั่งซื้อที่สองและสาม จะมีการหยิบขึ้นมาในครั้งเดียวและจัดส่งในที่สุด
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- a :=แผนที่ใหม่
- หากคำสั่งซื้อมีรายการซ้ำกัน
- คืนค่าเท็จ
- สำหรับ i แต่ละตัวในคำสั่ง ทำ
- ถ้าฉันขึ้นต้นด้วย "P" แล้ว
- a[รับหมายเลขคำสั่งซื้อ] =1
- มิฉะนั้น เมื่อฉันขึ้นต้นด้วย "D" แล้ว
- ถ้าหมายเลขคำสั่งซื้อไม่อยู่ใน a แล้ว
- คืนค่าเท็จ
- มิฉะนั้น
- a[หมายเลขคำสั่งจัดส่ง] ลดลง 1
- ถ้าหมายเลขคำสั่งซื้อไม่อยู่ใน a แล้ว
- ถ้าฉันขึ้นต้นด้วย "P" แล้ว
- คืนค่า จริง เมื่อผลรวมขององค์ประกอบทั้งหมดในรายการของค่าทั้งหมดของ a เท่ากับ 0 มิฉะนั้น เท็จ
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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