青训营笔记(4)

102 阅读3分钟

伴学笔记:解决“第三大分数”问题

问题背景

在编程练习中,我们经常会遇到需要对数据进行排序和筛选的问题。今天,我们要解决的问题是:给定一个分数数组,找到其中第三大的唯一分数。如果数组中不同的分数少于三个,则返回最大的分数。这个问题看似简单,但涉及到了去重、排序和条件判断等多个步骤,非常适合用来练习和巩固我们的编程技能。

解题思路

  1. 去重:首先,我们需要去除数组中的重复元素。因为题目要求的是第三大的不同分数,所以重复的分数不应该被计算在内。
  2. 排序:去重后的数组需要进行排序,以便我们能够方便地找到第三大的元素。
  3. 判断:根据排序后的数组长度,判断是否存在第三大的分数。如果不存在,则返回最大的分数。

数据结构的选择

  • 集合(Set):在Python中,集合是一种无序且不重复的元素集合。使用集合可以方便地去除数组中的重复元素。
  • 列表(List):列表是有序的集合,适合用来存储和操作数据。我们可以将去重后的元素存储在列表中,并对其进行排序。

算法步骤

  1. 去重:将输入的数组转换为集合,自动去除重复元素。
  2. 排序:对去重后的集合进行排序,使用降序排序以便于找到第三大的元素。
  3. 判断并返回结果:根据排序后的列表长度,返回相应的分数。如果列表长度小于3,则返回最大的分数;否则返回第三大的分数。

代码实现

def solution(n: int, nums: list) -> int:
    # 去重
    unique_nums = list(set(nums))
    
    # 排序
    sorted_nums = sorted(unique_nums, reverse=True)
    
    # 判断并返回结果
    if len(sorted_nums) < 3:
        return sorted_nums[0]  # 返回最大的分数
    else:
        return sorted_nums[2]  # 返回第三大的分数

if __name__ == '__main__':
    print(solution(3, [3, 2, 1]) == 1)
    print(solution(2, [1, 2]) == 2)
    print(solution(4, [2, 2, 3, 1]) == 1)

关键步骤解释

  • 去重unique_nums = list(set(nums)) 将数组转换为集合,自动去除重复元素,然后再转换回列表。
  • 排序sorted_nums = sorted(unique_nums, reverse=True) 对去重后的数组进行降序排序。
  • 判断if len(sorted_nums) < 3 判断去重后的数组长度是否小于3,如果是,则返回最大的分数;否则返回第三大的分数。

测试与调试

在编写代码后,我们需要进行测试以确保代码的正确性。我们可以使用题目中提供的测试样例来验证代码的输出是否符合预期。如果测试失败,我们需要检查代码中的逻辑错误,并进行相应的调试。

总结

通过解决这个问题,我们不仅练习了如何使用集合和列表进行数据处理,还巩固了排序和条件判断的基本操作。编程练习不仅仅是写代码,更重要的是理解问题的本质,选择合适的数据结构和算法,并通过测试和调试来验证代码的正确性。

进一步思考

  • 如果输入的数组非常大,如何优化代码的时间复杂度?
  • 是否可以使用其他数据结构或算法来解决这个问题?

通过不断的练习和思考,我们可以逐步提高自己的编程能力,掌握更多的编程技巧和方法。希望这篇伴学笔记能够帮助你更好地理解和解决这个问题。