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

โปรแกรมหาความยาวสับลิสต์สั้นที่สุดที่มีสมาชิกบ่อยที่สุดเท่ากับรายการเต็มใน Python

สมมติว่าเรามีรายการตัวเลขชื่อ nums ถ้าความถี่ของตัวเลขที่พบบ่อยที่สุดใน nums คือ k เราต้องหาความยาวของสับลิสต์สั้นที่สุด ที่ความถี่ของสมาชิกที่พบบ่อยที่สุดในสับลิสต์นั้นก็เท่ากับ k ด้วย

เช่น ถ้าอินพุตคือ nums = [10, 20, 30, 40, 30, 10] ผลลัพธ์จะเป็น 3 เพราะตัวเลขที่พบบ่อยสุดคือ 10 และ 30 ที่นี่ k = 2 ถ้าเลือกสับลิสต์ [30, 40, 30] นี่คือสับลิสต์สั้นที่สุดที่ 30 ปรากฏและความถี่ก็เป็น 2

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

  1. L := ขนาดของ nums
  2. rnums := nums ย้อนกลับ
  3. d := แมปความถี่ของแต่ละสมาชิกใน nums
  4. mx := ค่าสูงสุดของค่าใน d
  5. vs := รายการ k สำหรับแต่ละ k ใน d ถ้า d[k] == mx
  6. mn := L
  7. สำหรับแต่ละ v ใน vs:
    • mn := min(mn, (L - rnums.index(v)) - nums.index(v))
  8. คืนค่า mn

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

from collections import Counter

def solve(nums):
    L = len(nums)
    rnums = nums[::-1]
    d = Counter(nums)
    mx = max(d.values())
    vs = [k for k in d if d[k] == mx]
    mn = L
    for v in vs:
        mn = min(mn, (L - rnums.index(v)) - nums.index(v))
    return mn

nums = [10, 20, 30, 40, 30, 10]
print(solve(nums))

อินพุต

[10, 20, 30, 40, 30, 10]

เอาต์พุต

3