一、问题描述
返回一个包含 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。
样例2:
输入:
nums = [1], k = 1
输出:"1"
样例3:
输入:
nums = [4, 4, 4, 2, 2, 2, 3, 3, 1], k = 2
输出:"2,4"
最终代码
def solution(nums, k):
# 按元素值升序排序
top_k.sort(key=lambda x: x[0])
counter = Counter(nums)
# 获取频率最高的 k 个元素
top_k = counter.most_common(k)
# 返回结果
return ",".join(map(str, [num for num, _ in top_k]))
if __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")
二、代码历程
1.错误代码
from collections import Counter
def solution(nums, k):
counter = Counter(nums)
return ",".join(map(str, [num for num, _ in counter.most_common(k)]))
上述代码是错误的,在运行时正确输出True,但是在提交时出现错误:第3个测试用例解答错误
输入:`nums = [4, 4, 4, 2, 2, 2, 3, 3, 1], k = 2`
错误输出:`"4,2"`
正确输出:`"2,4"`
该代码的思路是
(1) 导入模块
from collections import Counter
这段代码导入了Python标准库 collections 中的 Counter 类。 Counter 是一个非常方便的工具,用于对可迭代对象中的元素进行计数,它会返回一个字典,其中键是元素,值是该元素在可迭代对象中出现的次数。
(2) 定义 solution 函数
def solution(nums, k):
counter = Counter(nums)
return ",".join(map(str, [num for num, _ in counter.most_common(k)]))
第一步:计数
counter = Counter(nums)
这里使用 Counter 类对输入的列表 nums 中的每个元素进行计数。例如,对于输入 nums = [1, 1, 1, 2, 2, 3] , counter 将会是一个类似 Counter({1: 3, 2: 2, 3: 1}) 的字典,其中键是列表中的元素,值是该元素出现的次数。
第二步:获取前 k 个高频元素
[num for num, _ in counter.most_common(k)]
counter.most_common(k) 会返回一个包含 k 个元组的列表,每个元组的形式是 (元素, 出现次数) ,按照元素出现次数从高到低排序。通过列表推导式 [num for num, _ in counter.most_common(k)] ,我们只提取出每个元组中的元素部分,即获取到了出现频率最高的 k 个元素组成的列表。例如,对于 counter = Counter({1: 3, 2: 2, 3: 1}) 和 k = 2 ,这一步会得到 [1, 2] 。
第三步:转换为字符串并拼接
return ",".join(map(str, [num for num, _ in counter.most_common(k)]))
首先, map(str, [num for num, _ in counter.most_common(k)]) 会将上一步得到的列表中的每个元素都转换为字符串形式。然后, ",".join() 会将这些字符串元素用逗号连接起来,形成最终要返回的字符串。例如,对于列表 [1, 2] ,经过这一步会返回 "1,2" 。
2.正确代码
出现问题之后,点击了“帮我检查一下代码”
MarsCode AI回复:
你的代码基本上是正确的,但有一个小问题需要修正。题目要求返回的字符串中的元素需要按升序排列,而你的代码直接使用了 counter.most_common(k),这会返回频率最高的 k 个元素,但不会按元素值本身进行排序。
修改建议
- 获取频率最高的 k 个元素:使用
counter.most_common(k)获取频率最高的 k 个元素。 - 按元素值升序排序:对这些元素按元素值进行升序排序。
- 返回结果:将排序后的元素转换为字符串并返回。
修改之后的代码是
from collections import Counter
def solution(nums, k):
counter = Counter(nums)
# 获取频率最高的 k 个元素
top_k = counter.most_common(k)
# 按元素值升序排序
top_k.sort(key=lambda x: x[0])
# 返回结果
return ",".join(map(str, [num for num, _ in top_k]))
if __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")
解释
counter.most_common(k)返回的是一个列表,列表中的每个元素是一个元组(num, count),表示元素num出现的次数count。top_k.sort(key=lambda x: x[0])按元素值x[0]进行升序排序。return ",".join(map(str, [num for num, _ in top_k]))将排序后的元素转换为字符串并返回。
这样修改后,你的代码就能正确地返回按升序排列的前 k 个高频元素。
三、使用MarsCode AI的优势
MarsCode AI 在代码检查方面展现出了无与伦比的便利性。无需将代码输入其中,只要选择“帮我检查一下编译区的代码”,它便能迅速启动全面扫描。它精准地定位潜在问题,从变量命名规范到函数调用的合理性,无一遗漏。其清晰明了的提示信息,让开发者能快速理解错误所在并知晓改进方向。与传统的人工代码检查相比,MarsCode AI 极大地节省了时间和精力,让开发者能够将更多的心思放在功能创新与优化上,为开发者们打造了一个高效、便捷、可靠的代码检查环境,助力开发工作一路畅行。