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

29 阅读3分钟

题目解析

题目:给定一个整数 n 和一个整数列表 nums,返回列表中第 n 大的不同分数。如果列表中的不同分数少于 n 个,则返回最大的分数。

思路

  1. 去重并排序:首先,我们需要去除列表中的重复分数,并对分数进行降序排序。
  2. 判断并返回结果:根据排序后的分数列表长度,如果长度大于等于 n,则返回第 n 大的分数(即排序后列表的第 n-1 个元素,因为索引从0开始);如果长度小于 n,则返回最大的分数(即排序后列表的第一个元素)。

图解

假设输入为 n = 4 和 nums = [2, 2, 3, 1]

  1. 去重[2, 3, 1]
  2. 排序[3, 2, 1](降序)
  3. 判断:长度小于 4,返回最大分数 3(如果长度大于等于 4,则返回第 4 大的分数,但在此例中不存在)。

代码详解

python复制代码
	def solution(n: int, nums: list) -> int:

	    # 去重并排序

	    unique_scores = sorted(set(nums), reverse=True)

	    

	    # 如果不同的分数有三个或以上,返回第三大的分数

	    if len(unique_scores) >= n:

	        return unique_scores[n-1]  # 注意索引是从0开始的,所以要n-1

	    else:

	        # 否则返回最大的分数

	        return unique_scores[0]

	 

	if __name__ == '__main__':

	    print(solution(3, [3, 2, 1]) == 1)  # 输出 True,因为第三大的分数是1

	    print(solution(2, [1, 2]) == 2)     # 输出 True,因为第二大的分数是2

	    print(solution(4, [2, 2, 3, 1]) == 1)  # 输出 False,但原代码输出为1,应为输出True,但根据题意应为返回最大的分数3,此处测试案例可能有误或表述不清,按照代码逻辑,此测试案例判断为True是基于返回了1(即最小的不同分数,但按题意理解应为返回最大分数3后的比较,此处应保持原代码输出说明)

知识总结

  • 集合去重:使用 set() 可以快速去除列表中的重复元素。
  • 排序:使用 sorted() 函数可以对列表进行排序,reverse=True 表示降序。
  • 索引访问:在 Python 中,列表的索引是从 0 开始的,因此在访问排序后的列表时需要注意索引偏移。

学习建议

  • 刷题策略:通过大量刷题,可以熟悉各种算法和数据结构的应用场景,提高编程能力。
  • 理解题意:在刷题过程中,务必仔细阅读题目要求,确保理解题意,避免因为误解题目而浪费时间。
  • 总结归纳:每刷完一套题目后,总结归纳新学到的知识点和解题技巧,形成自己的知识体系。

学习计划

  1. 制定刷题计划:每天固定时间刷题,比如每天刷 20 道题,逐步增加难度。
  2. 分类刷题:根据算法和数据结构的分类进行刷题,比如先刷数组和字符串相关的题目,再刷动态规划和图相关的题目。
  3. 利用错题:对于做错的题目,要仔细分析错误原因,并记录在错题本上,定期回顾。
  4. 定期复习:每周或每月对之前学过的知识点进行复习,巩固记忆。

工具运用

  • 豆包MarsCode AI刷题:利用豆包MarsCode AI刷题功能,可以快速获取大量题目和解析,提高刷题效率。
  • 在线编程平台:如 LeetCode、牛客网等,这些平台提供了丰富的题目和详细的解析,可以帮助我们更好地学习和提高。
  • 学习笔记:使用Markdown等工具记录学习笔记,整理知识点和解题技巧,方便日后复习。

通过以上方法,我们可以更高效地利用豆包MarsCode AI刷题功能和其他学习资源,提高自己的编程能力和算法水平。