青训营X豆包MarsCode 技术训练营题目理解| 豆包MarsCode AI 刷题

32 阅读3分钟

问题解析与代码详解

一、问题理解

小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他关注的是往届比赛中排名第三的分数,但有一个特殊情况:如果不同的分数只有两个或更少,他将选择最大的分数作为目标。

二、解题思路

  1. 去除重复分数:首先,我们需要从给定的分数数组中去除重复的分数,因为重复的分数不会影响排名的判断。
  2. 排序分数:接下来,我们需要对去重后的分数进行排序,以便找到第三大的分数或最大的分数。
  3. 选择目标分数:根据去重后分数的数量,我们决定是返回第三大的分数还是最大的分数。

三、代码详解

	def solution(n: int, nums: list) -> int:

	    # 转换为集合去除重复分数

	    unique_scores = set(nums)  # 使用集合自动去重

	    

	    # 将分数转换为列表并按降序排序

	    sorted_scores = sorted(unique_scores, reverse=True)  # 降序排序,方便后续取第三大和最大

	    

	    # 根据集合大小选择目标分数

	    if len(unique_scores) >= 3:

	        return sorted_scores[2]  # 返回第三大的分数(索引为2,因为是从0开始计数的)

	    else:

	        return sorted_scores[0]  # 返回最大的分数(索引为0,因为是降序排序)
  • 去除重复分数unique_scores = set(nums) 这行代码通过转换为集合的方式自动去除了分数数组中的重复元素。
  • 排序分数sorted_scores = sorted(unique_scores, reverse=True) 这行代码对去重后的分数进行了降序排序,使得最大的分数位于列表的第一个位置,依次类推。
  • 选择目标分数:通过判断去重后分数的数量,我们决定是返回排序后列表的第三个元素(即第三大的分数)还是第一个元素(即最大的分数)。

四、图解

由于这是一个算法问题,没有具体的图形可以展示,但我们可以想象以下步骤:

  1. 给定一个分数数组,例如 [3, 2, 1, 2, 3]
  2. 转换为集合后得到 {1, 2, 3}
  3. 排序后得到 [3, 2, 1]
  4. 根据集合大小(3个元素),返回第三大的分数 1

五、总结知识点

  • 集合的使用:集合可以自动去除重复元素。
  • 排序函数:sorted() 函数可以对列表进行排序,reverse=True 参数表示降序排序。
  • 索引访问:通过索引可以访问列表中的特定元素。

六、理解与学习建议

  1. 理解集合与排序:深入理解集合的特性和排序函数的工作原理,这对于处理类似的数据去重和排序问题非常有帮助。
  2. 练习索引访问:通过练习访问列表中的特定元素,可以更加熟练地处理列表数据。
  3. 多思考多实践:对于算法问题,多思考问题的本质和可能的解决方案,并通过实践来验证和优化你的思路。

通过理解这个问题和代码,我们可以更好地掌握集合、排序和索引访问等基础知识,并在实践中不断提升自己的编程能力。