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

โปรแกรมหาผลคูณสเกลาร์ของเวกเตอร์ที่เข้ารหัสแบบ Run-Length ใน Python

สมมติว่าเรามีสองรายการ nums1 และ nums2 แต่ละรายการแสดงเวกเตอร์ในรูปแบบ Run-Length Encoding ตัวอย่างเช่น เวกเตอร์ [1, 1, 1, 2, 2, 2, 2] แสดงเป็น [3, 1, 4, 2] (เพราะมี 1 สามตัว และ 2 สี่ตัว) เราต้องหาผลคูณสเกลาร์ (dot product) ของเวกเตอร์ทั้งสอง (ผลรวมของการคูณสมาชิกแต่ละคู่ในสองเวกเตอร์)

เช่น ถ้าอินพุตคือ nums1 = [2, 7, 5, 3], nums2 = [3, 5, 4, 2] ผลลัพธ์จะเป็น 109 เพราะเวกเตอร์คือ [7, 7, 3, 3, 3, 3, 3] • [5, 5, 5, 2, 2, 2, 2] = 7*5 + 7*5 + 3*5 + 3*2 + 3*2 + 3*2 + 3*2 = 35 + 35 + 15 + 6 + 6 + 6 + 6 = 109

ขั้นตอนการแก้ปัญหา

  1. ans := 0
  2. ในขณะที่ nums1 และ nums2 ทั้งคู่ไม่ว่าง:
    • val1 := นำสมาชิกสุดท้ายจาก nums1 ออก, count1 := นำสมาชิกสุดท้ายจาก nums1 ออก
    • val2 := นำสมาชิกสุดท้ายจาก nums2 ออก, count2 := นำสมาชิกสุดท้ายจาก nums2 ออก
    • ans := ans + (val1 * val2) * min(count2, count1)
    • ถ้า count2 > count1 แทรก |count2 - count1| และ val2 กลับเข้า nums2
    • มิฉะนั้นถ้า count1 > count2 แทรก |count2 - count1| และ val1 กลับเข้า nums1
  3. คืนค่า ans

ตัวอย่างการใช้งาน

def solve(nums1, nums2):
    ans = 0
    while nums1 and nums2:
        val1 = nums1.pop()
        count1 = nums1.pop()
        val2 = nums2.pop()
        count2 = nums2.pop()
        ans += (val1 * val2) * min(count2, count1)
        if count2 > count1:
            nums2.append(abs(count2 - count1))
            nums2.append(val2)
        elif count1 > count2:
            nums1.append(abs(count2 - count1))
            nums1.append(val1)
    return ans

nums1 = [2, 7, 5, 3]
nums2 = [3, 5, 4, 2]
print(solve(nums1, nums2))

อินพุต

[2, 7, 5, 3], [3, 5, 4, 2]

เอาต์พุต

109