สมมติว่าเรามีรายการสตริงที่เรียกว่าคำสั่ง แต่ละองค์ประกอบในรายการคำสั่งซื้อเริ่มต้นด้วย "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