游戏排名第三大的分数 | 豆包MarsCode AI 刷题

62 阅读3分钟

解决这类问题的核心是:对分数列表进行去重和排序,然后判断不同分数的数量,最终返回相应的值

步骤解析

  1. 去重

    • 使用 set(nums) 将列表中的重复分数去掉,只保留不同的分数。
  2. 排序

    • 将去重后的分数列表进行降序排列,使得最大值出现在第一位,第三大的分数出现在第三位。
    • 可以使用 sorted(..., reverse=True) 实现降序排列。
  3. 判断不同分数的数量

    • 如果去重后分数的数量少于3个(即列表长度小于3),直接返回最大的分数,即排序列表的第一个元素。
    • 否则,返回排序列表的第三个元素。
  4. 边界处理

    • 输入分数列表为空,返回需要特别处理。
    • 输入分数中有重复值或负数时,代码逻辑不受影响。
    # 去重并排序(降序)
    unique_scores = sorted(set(nums), reverse=True)
    
    # 如果不同分数少于3个,返回最大值
    if len(unique_scores) < 3:
        return unique_scores[0]
    
    # 否则返回第三大的分数
    return unique_scores[2]

# 测试用例
if __name__ == '__main__':
    print(solution(3, [3, 2, 1]) == 1)      # 测试用例 1
    print(solution(2, [1, 2]) == 2)         # 测试用例 2
    print(solution(4, [2, 2, 3, 1]) == 1)   # 测试用例 3
    print(solution(5, [1, 1, 1, 1, 1]) == 1) # 边界测试,所有分数相同
    print(solution(0, []) == None)          # 边界测试,空列表

样例详解

样例1

输入:n = 3, nums = [3, 2, 1]

  1. 去重后{3, 2, 1}
  2. 排序后(降序):[3, 2, 1]
  3. 不同分数大于等于3,返回第三大的分数:1

输出:1


样例2

输入:n = 2, nums = [1, 2]

  1. 去重后{1, 2}
  2. 排序后(降序):[2, 1]
  3. 不同分数少于3个,返回最大值:2

输出:2


样例3

输入:n = 4, nums = [2, 2, 3, 1]

  1. 去重后{1, 2, 3}
  2. 排序后(降序):[3, 2, 1]
  3. 不同分数大于等于3,返回第三大的分数:1

输出:1


边界情况分析

  1. 所有分数相同

    • 输入:nums = [1, 1, 1, 1, 1]
    • 去重后:{1}
    • 排序后:[1]
    • 由于只有一个分数,直接返回最大值:1
  2. 输入为空

    • 输入:nums = []
    • 返回值需要特殊处理。可以通过添加判断 if not nums: return None
  3. 负数情况

    • 输入:nums = [-1, -2, -3]
    • 去重后:{-1, -2, -3}
    • 排序后:[-1, -2, -3]
    • 返回第三大的分数:-3

时间复杂度分析

  1. 去重

    • set(nums) 的时间复杂度为 O(n)O(n),其中 nn 是数组的长度。
  2. 排序

    • 对去重后的数组排序,时间复杂度为 O(klog⁡k)O(klogk),其中 kk 是去重后数组的长度,显然 k≤nk≤n。
  3. 总体复杂度

    • 总复杂度为 O(n+klog⁡k)O(n+klogk),由于 kk 通常较小,近似为 O(n)O(n)。

总结

  1. 核心知识点

    • 使用 set 去重。
    • 使用 sorted 进行降序排列。
    • 灵活处理边界情况(如分数少于3个)。
  2. 优势

    • 代码简洁,处理多种场景。
    • 时间复杂度低,适合大规模数据。
  3. 可扩展性

    • 如果需要找第 kk 大分数,可以扩展到任意 kk 的场景。
    • 适合拓展到比赛数据分析等实际应用。