📜  门|门 IT 2005 |问题 37(1)

📅  最后修改于: 2023-12-03 15:42:21.611000             🧑  作者: Mango

门|门 IT 2005 | 问题 37

问题描述

在一张表格中,有n个号码,其中某些号码重复出现。请写一个程序,找到出现次数最多的前k个号码以及他们的出现次数。

程序介绍

这个问题可以使用哈希表来解决,先将所有号码存入哈希表中,并统计每个号码出现的次数。之后可以使用最小堆来找到前k个出现次数最多的号码和他们的出现次数。

程序流程如下:

  1. 使用哈希表来统计号码出现的次数;
  2. 建立最小堆,将哈希表中的号码和次数插入到堆中,如果堆的大小超过k,则删除堆顶元素;
  3. 遍历堆中的元素,并输出号码以及出现次数。

具体实现可以参考以下代码片段:

# 将号码存入哈希表中,并统计出现次数
freq = {}
for num in nums:
    if num not in freq:
        freq[num] = 1
    else:
        freq[num] += 1

# 建立最小堆,将号码和次数插入到堆中
heap = []
for num, count in freq.items():
    heapq.heappush(heap, (count, num))
    if len(heap) > k:
        heapq.heappop(heap)

# 输出前k个出现次数最多的号码和次数
res = []
while heap:
    count, num = heapq.heappop(heap)
    res.append((num, count))

res.reverse()
print(res)
总结

这个问题虽然简单,但是可以灵活运用哈希表和最小堆来解决。在实际开发中,我们也要注重数据结构的选择,避免无意义的遍历与计算,以提高程序的效率。