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

โปรแกรมหาลำดับที่มีความถี่เท่ากันหลังลบตัวเลขหนึ่งใน Python

ให้ลิสต์ตัวเลข หาความยาว prefix ยาวที่สุด ที่เมื่อลบตัวเลข 1 ตัวออก จะทำให้ทุกตัวเลขที่เหลือมีความถี่เท่ากัน

ตัวอย่าง: [2, 4, 4, 7, 7, 6, 6] → 7 (ลบ 2 ออก เหลือ 4,4,7,7,6,6 ทุกตัวมีความถี่ 2)

อัลกอริธึม

  • ใช้ num_freq นับความถี่แต่ละตัวเลข
  • ใช้ freq_freq นับว่ามีตัวเลขกี่ตัวที่มีความถี่เท่ากัน
  • ใช้ diff_freq เก็บความถี่ที่มีอยู่จริง
  • ตรวจสอบเงื่อนไข: ถ้ามีความถี่ชนิดเดียว หรือ 2 ชนิดที่ต่างกัน 1 และจำนวนตัวเลขต่างกัน 1 → valid

การนำไปใช้

from collections import defaultdict

class Solution:
    def solve(self, nums):
        num_freq = defaultdict(int)
        freq_freq = defaultdict(int)
        diff_freq = set()
        result = 1
        for i, num in enumerate(nums):
            cur_freq = num_freq[num]
            num_freq[num] += 1
            freq_freq[cur_freq] -= 1
            freq_freq[cur_freq + 1] += 1
            diff_freq.add(cur_freq + 1)
            if cur_freq in diff_freq and freq_freq[cur_freq] == 0:
                diff_freq.remove(cur_freq)
            df_list = list(diff_freq)
            if len(df_list) == 1:
                result = i + 1
            elif (len(df_list) == 2 and
                  any(x == 1 for x in [abs(freq_freq[df_list[0]] - freq_freq[df_list[1]]), freq_freq[df_list[0]], freq_freq[df_list[1]]]) and
                  any(x == 1 for x in [abs(df_list[0] - df_list[1]), df_list[0], df_list[1]])):
                result = i + 1
        return result

ob = Solution()
print(ob.solve([2, 4, 4, 7, 7, 6, 6]))  # 7