查找热点数据问题| 豆包MarsCode AI刷题

41 阅读2分钟

问题描述

给你一个整数数组 nums 和一个整数 k,请你用一个字符串返回其中出现频率前 k 高的元素。请按升序排列。

你所设计算法的时间复杂度必须优于 O(n log n),其中 n 是数组大小。

输入

  • nums: 一个正整数数组
  • k: 一个整数

返回

返回一个包含 k 个元素的字符串,数字元素之间用逗号分隔。数字元素按升序排列,表示出现频率最高的 k 个元素。

参数限制

  • 1 <= nums[i] <= 10^4
  • 1 <= nums.length <= 10^5
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

测试样例

样例1:

输入:nums = [1, 1, 1, 2, 2, 3], k = 2
输出:"1,2"
解释:元素 1 出现了 3 次,元素 2 出现了 2 次,元素 3 出现了 1 次。因此前两个高频元素是 1 和 2。

对于这道题,我的理解是这样的:

from collections import Counterdef solution(nums, k):    p = Counter(nums)        # 获取前 k 个最常见的元素    most_common_elements = p.most_common(k)        # 只提取元素,不需要排序    result = [num for num, count in most_common_elements]        # 将结果列表转换为字符串,并用逗号分隔    result_str = ','.join(map(str, result))        return result_strif __name__ == "__main__":    #  You can add more test cases here    print(solution([1,1,1,2,2,3], 2))  # 输出: "1,2"    print(solution([1], 1))  # 输出: "1"    print(solution([4,4,4,2,2,2,3,3,1], 2))  # 输出: "4,2"

问题理解

给定一个整数数组 nums 和一个整数 k,要求返回出现频率前 k 高的元素,并以字符串形式返回,元素之间用逗号分隔。

数据结构选择

  1. **Counter**:

    • 使用 collections.Counter 来统计每个元素的出现频率。Counter 是一个字典子类,用于计数可哈希对象。
  2. **most_common(k)**:

    • Counter 对象的 most_common(k) 方法返回一个列表,其中包含前 k 个最常见的元素及其频率。

算法步骤

  1. 统计频率

    • 使用 Counter 统计数组中每个元素的出现频率。
  2. 获取前 k 个最常见的元素

    • 使用 most_common(k) 方法获取前 k 个最常见的元素及其频率。
  3. 提取元素

    • most_common(k) 返回的列表中提取元素,忽略频率。
  4. 转换为字符串

    • 将提取的元素列表转换为字符串,并用逗号分隔。

这样就可以将一个整数数组中出现频率前 k 高的元素提取出来,并以字符串形式返回,元素之间用逗号分隔。这样,你就可以满足题目的要求。虽然最后的答案好像有些瑕疵,不能完全算ac了。(记得注意这个内容:题目数据保证答案唯一,数组中前 k 个高频元素的集合是唯一的)

但是对于题目的理解还是没有问题的,当给定一个整数时,我们需要返回前k高频率的字符,可以使用 collections.Counter 来统计每个元素的出现频率。Counter 是一个字典子类,用于计数可哈希对象,从 most_common(k) 返回的列表中提取元素,忽略频率,将提取的元素列表转换为字符串,并用逗号分隔,这样就可以将一个整数数组中出现频率前 k 高的元素提取出来,并以字符串形式返回。

其实在力扣中好像也见到了类似的题目,就是不知道准不准确,这样的思路还是值得学习的!!