Python程序:查找具有相同频率的序列
假设我们有一个数字列表。我们需要找到最长数字序列的长度,使得当我们从序列中删除一个数字时,每个数字出现的次数都相同。
因此,如果输入类似于 numbers = [2, 4, 4, 7, 7, 6, 6],则输出将为 7。
为了解决这个问题,我们将遵循以下步骤:
num_freq := 一个新的映射
freq_freq := 一个新的映射
diff_freq := 一个新的集合
result := 1
对于每个索引 I 和 nums 中的值 num,执行以下操作:
cur_freq := num_freq[num]
num_freq[num] := num_freq[num] + 1
freq_freq[cur_freq] := freq_freq[cur_freq] − 1
freq_freq[cur_freq + 1] := freq_freq[cur_freq + 1] + 1
将 cur_freq + 1 添加到 diff_freq 中
如果 cur_freq 存在于 diff_freq 中,并且 freq_freq[cur_freq] 等于 0,则:
从 diff_freq 中删除 cur_freq
df_list := 通过获取 diff_freqs 的元素创建的新列表
如果 df_list 的大小为 1,则:
result := i + 1
否则,当 df_list 的大小为 2 且(当 [|freq_freq[df_list[0]] - freq_freq[df_list[1]]|,freq_freq[df_list[0]],freq_freq[df_list[1]]] 中的任何一个为 1)并且(当 [|df_list[0] - df_list[1]|,df_list[0],df_list[1]] 中的任何一个为 1)时,则:
result := i + 1
返回 result
让我们看看下面的实现来更好地理解:
示例
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]))
输入
numbers = [2, 4, 4, 7, 7, 6, 6]
输出
7