第五篇|MarsCode AI的使用(查找热点数据问题)|豆包MarsCode AI技术刷题

37 阅读5分钟

一、问题描述

返回一个包含 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([111223], 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 个元素,但不会按元素值本身进行排序。

修改建议

  1. 获取频率最高的 k 个元素:使用 counter.most_common(k) 获取频率最高的 k 个元素。
  2. 按元素值升序排序:对这些元素按元素值进行升序排序。
  3. 返回结果:将排序后的元素转换为字符串并返回。

修改之后的代码是

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 极大地节省了时间和精力,让开发者能够将更多的心思放在功能创新与优化上,为开发者们打造了一个高效、便捷、可靠的代码检查环境,助力开发工作一路畅行。