Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมนับจำนวนบล็อกที่ถูกปิด k ครั้งโดยการเดินใน Python


สมมติว่าเรามีสองรายการที่เรียกว่าการเดินและเป้าหมาย ที่จุดเริ่มต้น เราอยู่ที่ตำแหน่ง 0 ในเส้นหนึ่งมิติ ตอนนี้ |เดิน[i]| แสดงถึงจำนวนก้าวที่เดิน และเมื่อเดิน[i] เป็นบวก แสดงว่าเดินถูกต้อง และลบไปทางซ้าย เมื่อเราเดิน เราจะย้ายหนึ่งช่วงตึก นั่นคือตำแหน่งจำนวนเต็มถัดไปหรือก่อนหน้า เราต้องหาจำนวนบล็อกที่เดินตามจำนวนเป้าหมายเป็นอย่างน้อย

ดังนั้น ถ้า input เหมือนกับ walks =[3, -7, 2] target =2 แล้ว output จะเป็น 5 จากรูปต่อไปนี้ เราจะเห็น [0, 1], [1, 2], [2 , 3], [-4, -3], [-3, -2] ครอบคลุม k =2 ครั้ง

โปรแกรมนับจำนวนบล็อกที่ถูกปิด k ครั้งโดยการเดินใน Python

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ตำแหน่ง :=0
  • กระโดด :=แผนที่แฮช โดยที่ค่าเริ่มต้นคือ 0 เมื่อไม่มีคีย์
  • สำหรับการเดินแต่ละเขต ให้ทำ
    • jumps[pos] :=jumps[pos] + 1 if dist> 0 มิฉะนั้น -1
    • กระโดด[pos + dist] :=กระโดด[pos + dist] - 1 ถ้า dist> 0 มิฉะนั้น -1
    • pos :=pos + dist
  • lastpos :=0
  • ระดับ :=0
  • รวม :=0
  • สำหรับแต่ละตำแหน่ง pos และค่า val ในคู่คีย์-ค่าที่เรียงลำดับของการกระโดด ทำ
    • ถ้าระดับ>=เป้าหมาย แล้ว
      • ผลรวม :=รวม + ตำแหน่ง - ตำแหน่งสุดท้าย
    • ระดับ :=ระดับ + วาล
    • lastpos :=pos
  • ผลตอบแทนรวม

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

from collections import defaultdict
def solve(walks, target):
   pos = 0
   jumps = defaultdict(int)
   for dist in walks:
      jumps[pos] += 1 if dist > 0 else -1
      jumps[pos + dist] -= 1 if dist > 0 else -1
      pos += dist
   lastpos = level = total = 0
   for pos, val in sorted(jumps.items()):
      if level >= target:
         total += pos - lastpos
      level += val
      lastpos = pos
   return total

walks = [3, -7, 2]
target = 2
print(solve(walks, target))

อินพุต

[3, -7, 2], 2

ผลลัพธ์

5