在Python中查找具有等效频率的序列的程序
假设我们有一个数字列表。我们必须找出一个数字序列的最长长度,使得当我们从该序列中删除一个数字时,每个数字都出现相同的次数。
因此,如果输入如下:numbers = [2, 4, 4, 7, 7, 6, 6],则输出将为7。
为了解决这个问题,我们将跟随以下步骤:
- num_freq:=一个新映射
-
freq_freq:=一个新映射
-
diff_freq:=一个新的集合
-
result:= 1
-
对于数字中的每个索引I和值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
- 通过获取diff_freqs的元素创建一个新列表df_list
-
如果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
- cur_freq:=num_freq[num]
- 返回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]],
]
)
并且任何一个 [abs(df_list [0] - df_list [1]],df_list [0],df_list [1]])等于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