问题描述
小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:
- 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
- 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。
请你帮小M根据给定的分数数组计算目标分数。
测试样例
样例1:
输入:
n = 3,nums = [3, 2, 1]
输出:1
针对问题的思路:
- 去重:首先需要去除数组中的重复元素,因为题目要求的是第三大的唯一分数。
- 排序:将去重后的数组进行排序,以便找到第三大的元素。
- 判断:如果去重后的数组长度小于3,则返回最大的分数;否则返回第三大的分数。
算法步骤
- 去重:使用Python的集合(
set)来去除重复元素。 - 排序:将去重后的集合转换为列表并进行排序。
- 判断并返回结果:根据排序后的列表长度,返回相应的分数。
unique_nums = list(set(nums)):将数组转换为集合以去除重复元素,然后再转换回列表。unique_nums.sort():对去重后的列表进行排序。if len(unique_nums) < 3:判断去重后的列表长度是否小于3,如果是,则返回最大的分数;否则返回第三大的分数。
代码实现
# 去重
unique_nums = list(set(nums))
# 排序
unique_nums.sort()
# 判断并返回结果
if len(unique_nums) < 3:
# 如果唯一分数的数量少于三个,返回最大的分数
return unique_nums[-1]
else:
# 否则返回第三大的分数
return unique_nums[-3]
if __name__ == '__main__':
print(solution(3, [3, 2, 1]) == 1)
print(solution(2, [1, 2]) == 2)
print(solution(4, [2, 2, 3, 1]) == 1)
解题总结
-
去重处理:
- 使用集合
set(nums)去除重复元素,得到所有不同的分数。 - 集合自动去重,但需要转换回列表以便排序。
- 使用集合
-
排序处理:
- 使用
sorted(unique_scores, reverse=True)对不同的分数进行降序排序。 reverse=True参数使排序结果从大到小排列。
- 使用
-
目标分数确定:
- 检查不同分数的数量。
- 如果数量大于或等于3,返回第三大的分数。
- 如果数量小于3,返回最大的分数。
解题感悟
-
问题分解:
- 将大问题分解成多个小问题,逐步解决。首先去重,然后排序,最后确定目标分数。
-
数据结构的选择:
- 使用集合可以方便地去除重复元素,但需要转换回列表进行排序。
- 集合的去重功能使得代码更加简洁。
-
条件判断:
- 通过简单的条件判断来确定目标分数,逻辑清晰易懂。
- 条件判断语句的顺序和逻辑关系要清晰,确保逻辑正确无误。
-
代码简洁性:
- 代码尽量简洁,避免冗余。每一步都尽量简洁地完成任务。
- 使用内置函数和标准库可以提高代码的可读性和效率。
-
测试样例:
- 提供多种测试样例,确保代码在不同情况下都能正确工作。特别是边界情况,如数组中只有两个不同的分数或只有一个分数的情况。