题目解析
题目:给定一个整数 n 和一个整数列表 nums,返回列表中第 n 大的不同分数。如果列表中的不同分数少于 n 个,则返回最大的分数。
思路
- 去重并排序:首先,我们需要去除列表中的重复分数,并对分数进行降序排序。
- 判断并返回结果:根据排序后的分数列表长度,如果长度大于等于
n,则返回第n大的分数(即排序后列表的第n-1个元素,因为索引从0开始);如果长度小于n,则返回最大的分数(即排序后列表的第一个元素)。
图解
假设输入为 n = 4 和 nums = [2, 2, 3, 1]:
- 去重:
[2, 3, 1] - 排序:
[3, 2, 1](降序) - 判断:长度小于
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 开始的,因此在访问排序后的列表时需要注意索引偏移。
学习建议
- 刷题策略:通过大量刷题,可以熟悉各种算法和数据结构的应用场景,提高编程能力。
- 理解题意:在刷题过程中,务必仔细阅读题目要求,确保理解题意,避免因为误解题目而浪费时间。
- 总结归纳:每刷完一套题目后,总结归纳新学到的知识点和解题技巧,形成自己的知识体系。
学习计划
- 制定刷题计划:每天固定时间刷题,比如每天刷 20 道题,逐步增加难度。
- 分类刷题:根据算法和数据结构的分类进行刷题,比如先刷数组和字符串相关的题目,再刷动态规划和图相关的题目。
- 利用错题:对于做错的题目,要仔细分析错误原因,并记录在错题本上,定期回顾。
- 定期复习:每周或每月对之前学过的知识点进行复习,巩固记忆。
工具运用
- 豆包MarsCode AI刷题:利用豆包MarsCode AI刷题功能,可以快速获取大量题目和解析,提高刷题效率。
- 在线编程平台:如 LeetCode、牛客网等,这些平台提供了丰富的题目和详细的解析,可以帮助我们更好地学习和提高。
- 学习笔记:使用Markdown等工具记录学习笔记,整理知识点和解题技巧,方便日后复习。
通过以上方法,我们可以更高效地利用豆包MarsCode AI刷题功能和其他学习资源,提高自己的编程能力和算法水平。