学习笔记之AI 刷题 34 | 豆包MarsCode AI刷题

75 阅读3分钟

题目解析

小M想通过查看往届游戏比赛的排名来确定自己的目标分数。目标是通过给定的分数列表,计算出第三大的分数,或者选择最大的分数作为目标。具体规则如下:

  1. 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
  2. 如果不同的分数只有两个或更少,则返回最大的分数。

输入

  • n:表示分数的数量。
  • nums:一个包含 n 个整数的列表,代表所有的分数。

输出

  • 返回小M的目标分数,符合规则。

思路分析

这个问题的关键是如何根据不同的分数数量来决定返回的分数。具体的解决方案可以分为以下几步:

  1. 去重:首先,我们需要确保考虑的分数是唯一的,因为如果分数列表中有重复的分数,我们只能算作一个不同的分数。

  2. 排序:将去重后的分数从小到大排序,方便我们从中选择第三大分数或者最大分数。

  3. 判断条件

    • 如果去重后的分数数量大于或等于 3,则返回第三大的分数(即排序后的倒数第三个元素)。
    • 如果去重后的分数数量小于 3,则返回最大的分数(即排序后的最后一个元素)。

具体步骤

  1. 去重:使用 set(nums) 来去除重复的分数,因为集合(set)自动去重。

  2. 排序:将去重后的分数排序,使用 sorted() 函数。

  3. 判断条件:根据去重后的列表长度判断是否有足够的不同分数:

    • 如果有 3 个或更多的不同分数,返回倒数第三个分数。
    • 如果有 2 个或更少的不同分数,返回最大的分数。

代码实现

def solution(n: int, nums: list) -> int:
    # 去重并排序
    unique_scores = sorted(set(nums))
    
    # 如果有3个或更多不同的分数,返回第三大的分数
    if len(unique_scores) >= 3:
        return unique_scores[-3]
    
    # 否则返回最大的分数
    return unique_scores[-1]

# 测试样例
if __name__ == '__main__':
    # 第三大的分数是 1
    print(solution(3, [3, 2, 1]) == 1)  
    
    # 只有两个不同分数,返回最大的 2
    print(solution(2, [1, 2]) == 2)    
    
    # 第三大的分数是 1
    print(solution(4, [2, 2, 3, 1]) == 1)

代码详解

  1. 去重排序

    unique_scores = sorted(set(nums))
    
    • set(nums):去除 nums 中的重复分数。
    • sorted(set(nums)):对去重后的分数进行排序,得到从小到大的顺序。
  2. 判断条件

    if len(unique_scores) >= 3:
        return unique_scores[-3]
    return unique_scores[-1]
    
    • 如果去重后的分数数量 len(unique_scores) 大于或等于 3,那么返回倒数第三个元素 unique_scores[-3]
    • 否则,返回最大的分数 unique_scores[-1]

时间复杂度

  • 去重操作set(nums) 的时间复杂度是 O(n),其中 n 是分数列表的长度。
  • 排序操作sorted() 函数的时间复杂度是 O(k log k),其中 k 是去重后列表的长度,最多为 n,因此排序的复杂度为 O(n log n)。
  • 总时间复杂度:O(n log n),因为排序是主导复杂度。

空间复杂度

  • 使用了额外的集合 set(nums) 和排序后的列表 unique_scores,所以空间复杂度为 O(n),其中 n 是分数列表的长度。