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

51 阅读3分钟

小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:

  1. 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
  2. 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。

请你帮小M根据给定的分数数组计算目标分数。 为了帮助小M确定他的目标分数,我们需要根据给定的分数数组来找出第三大的分数。如果数组中不同的分数少于三个,我们就选择最大的分数作为目标分数。下面是一个解决这个问题的步骤:

  1. 首先,我们需要从给定的分数数组中提取出所有不同的分数。这可以通过将数组转换为集合(set)来实现,因为集合会自动去除重复的元素。
  2. 然后,我们需要将这个集合中的元素按照从大到小的顺序排序。在Python中,我们可以使用sorted()函数,并设置参数reverse=True来实现降序排序。
  3. 接下来,我们检查排序后的集合的长度。如果长度大于或等于3,那么第三大的分数就是排序后集合中的第三个元素。如果长度小于3,那么我们选择最大的分数,即排序后集合中的第一个元素。
  4. 最后,我们返回目标分数。

下面是一个Python函数的实现:

python
def find_target_score(scores):
    # Step 1: Remove duplicates by converting the list to a set
    unique_scores = set(scores)
    
    # Step 2: Sort the unique scores in descending order
    sorted_scores = sorted(unique_scores, reverse=True)
    
    # Step 3: Determine the target score based on the length of the sorted list
    if len(sorted_scores) >= 3:
        target_score = sorted_scores[2]  # Third largest score
    else:
        target_score = sorted_scores[0]  # Largest score
    
    # Step 4: Return the target score
    return target_score

# Example usage:
scores = [10, 20, 30, 40, 50, 30, 20]
print(find_target_score(scores))  # Output: 30

这个函数首先去除了分数数组中的重复元素,然后对剩余的元素进行降序排序。根据排序后的元素数量,它选择第三大的分数或最大的分数作为目标分数,并返回这个分数。

  1. 效率问题

    • 使用集合去重可能会导致排序后的列表中元素的顺序与原始列表中的顺序不同。如果原始顺序很重要,这可能是一个问题。
    • 对于非常大的分数数组,将所有分数存储在集合中可能会导致较高的内存使用。
  2. 代码可读性

    • 代码中的注释虽然解释了步骤,但对于新手来说,可能需要更详细的解释来理解为什么选择这样的方法。
  3. 错误处理

    • 代码没有处理空数组或非数字元素的情况。在实际应用中,应该添加错误处理来确保代码的健壮性。
  4. 泛用性

    • 代码只返回了一个目标分数,但如果有多个相同的第三大分数,它只返回其中之一。如果需要所有第三大分数的列表,代码需要修改。
  5. 性能优化

    • 如果分数数组已经排序,或者我们可以在不使用集合去重的情况下找到第三大的分数,那么代码可以进一步优化。
  6. 代码简洁性

    • 代码可以通过使用更简洁的Python特性来简化,例如列表推导式或内置函数