青训营题目之游戏排名第三大的分数| 豆包MarsCode AI 刷题

49 阅读2分钟

问题描述

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

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

请你帮小M根据给定的分数数组计算目标分数。

整体思路分析

  1. 首先需要将重复的分数删去,再将分数按从小到大排列
  2. 进行判断分数个数
  3. 分数两个及以下时,则直接输出最大分数
  4. 分数三个及以上时,输出其第三大的分数

注意事项

要记得删去重复的分数,否则在输出时可能会出错,我最开始写的时候没有考虑到这一点,就导致有一个案例输出的分数为第二大的分数

具体代码

  1. 首先进行分数个数的判断,用if条件句进行判断即可,分为等于1,等于2,大于等于三三种情况
if (a == 2)
{}
else if (a == 1)
{}
else
{}
  1. 先将重复的分数删去,再对剩余分数进行从小到大的排列,这里有两种方法:第一种可以利用算法来将重复的数据删去,再进行排列;第二种则是利用set数组不能有重复的数据这一特性来进行消去重复数据,再将数据重新传入vector数组中,从而能够进行数据访问
#第一种方法
sort(nums.begin(), nums.end());
auto it = unique(nums.begin(), nums.end());//记录重复数字迭代器
nums.erase(it, nums.end());
int a = nums.size();

#第二种方法
sort(nums.begin(), nums.end());
    set<int> s;
    for (vector<int>::iterator it = nums.begin(); it != nums.end(); it++)
    {
        s.insert(s.begin(), *it);
    }
    nums.clear();
    for (int num : s)
    {
        nums.push_back(num);
    }
    int a = nums.size();
  1. 当分数个数为1时,直接输出该数即可,本身就是最大的
        return nums[0];
  1. 当分数个数为2时,则可用三目运算符或者完整的if判断句来输出最大的数
int max;
max = (nums[0] > nums[1] ? nums[0] : nums[1]);
return max;
  1. 当分数个数为3时,直接返回其倒数第三个数据即可
return nums[a - 3];

感悟

通过这个题的学习,进一步加深了我对于set数组,以及unique函数等的理解,让我学会对于特定的问题要使用合适的数组与算法来解决,而不是用某一个万金油的数组就能够快速的解决问题