问题描述
小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:
- 如果分数中有三个或以上不同的分数,返回其中第三大的分数。
- 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。
请你帮小M根据给定的分数数组计算目标分数。
整体思路分析
- 首先需要将重复的分数删去,再将分数按从小到大排列
- 进行判断分数个数
- 分数两个及以下时,则直接输出最大分数
- 分数三个及以上时,输出其第三大的分数
注意事项
要记得删去重复的分数,否则在输出时可能会出错,我最开始写的时候没有考虑到这一点,就导致有一个案例输出的分数为第二大的分数
具体代码
- 首先进行分数个数的判断,用if条件句进行判断即可,分为等于1,等于2,大于等于三三种情况
if (a == 2)
{}
else if (a == 1)
{}
else
{}
- 先将重复的分数删去,再对剩余分数进行从小到大的排列,这里有两种方法:第一种可以利用算法来将重复的数据删去,再进行排列;第二种则是利用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时,直接输出该数即可,本身就是最大的
return nums[0];
- 当分数个数为2时,则可用三目运算符或者完整的if判断句来输出最大的数
int max;
max = (nums[0] > nums[1] ? nums[0] : nums[1]);
return max;
- 当分数个数为3时,直接返回其倒数第三个数据即可
return nums[a - 3];
感悟
通过这个题的学习,进一步加深了我对于set数组,以及unique函数等的理解,让我学会对于特定的问题要使用合适的数组与算法来解决,而不是用某一个万金油的数组就能够快速的解决问题