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

โปรแกรมนับจำนวนสวอปที่จำเป็นสำหรับจัดกลุ่ม 1s ทั้งหมดเข้าด้วยกันใน Python


สมมติว่าเรามีสตริงไบนารี และเราสามารถสลับสองบิตใดๆ ก็ได้ เราต้องหาจำนวนสวอปขั้นต่ำที่จำเป็นในการจัดกลุ่มทั้งหมดเข้าด้วยกัน

ดังนั้น หากอินพุตเป็น s ="0111001" ผลลัพธ์จะเป็น 1 เนื่องจากเราสามารถทำการสลับเหล่านี้ได้:0111001 -> 1111000

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

  • data :=รายการ 0s และ 1s จากสตริงไบนารีที่กำหนด
  • ตั้งค่าหนึ่ง :=0, n:=ความยาวของอาร์เรย์ข้อมูล
  • สร้างผลรวมอาร์เรย์ของขนาด n และเติมค่านี้ด้วย 0, set summ[0] :=data[0]
  • หนึ่ง :=หนึ่ง + ข้อมูล[0]
  • สำหรับ i ในช่วง 1 ถึง n – 1
    • summ[i] :=summ[i - 1] + data[i]
    • หนึ่ง :=หนึ่ง + data[i]
  • แทน :=หนึ่ง
  • ซ้าย :=0, ขวา :=หนึ่ง – 1
  • ขณะขวา
  • ถ้าเหลือ 0 แล้ว temp :=summ[right] หรือ temp :=summ[right] – summ[left - 1]
  • ans :=ขั้นต่ำของ ans หนึ่ง – ชั่วคราว
  • เพิ่มขวาและซ้าย 1
  • คืนสินค้า
  • ตัวอย่าง (Python)

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

    class Solution(object):
       def solve(self, s):
          data = list(map(int, list(s)))
          one = 0
          n = len(data)
          summ=[0 for i in range(n)]
          summ[0] = data[0]
          one += data[0]
          for i in range(1,n):
             summ[i] += summ[i-1]+data[i]
             one += data[i]
          ans = one
          left = 0
          right = one-1
          while right <n:
             if left == 0:
                temp = summ[right]
             else:
                temp = summ[right] - summ[left-1]
             ans = min(ans,one-temp)
             right+=1
             left+=1
          return ans
    ob = Solution()
    s = "0111001"
    print(ob.solve(s))

    อินพุต

    "0111001"

    ผลลัพธ์

    1