题目
红包运气排行榜
问题描述
小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。
测试样例
样例1:
输入:
n = 4 ,s = ["a", "b", "c", "d"] ,x = [1, 2, 2, 1]
输出:['b', 'c', 'a', 'd']
样例2:
输入:
n = 3 ,s = ["x", "y", "z"] ,x = [100, 200, 200]
输出:['y', 'z', 'x']
样例3:
输入:
n = 5 ,s = ["m", "n", "o", "p", "q"] ,x = [50, 50, 30, 30, 20]
输出:['m', 'n', 'o', 'p', 'q']
思路解析
1.对于这种s与x对应,且根据某个值排序的情况,可以考虑使用结构体排序
2.创建结构体数组,将名字与其对应的金额输入
3.构建排序规则,如果获取的钱相同则按照顺序小的在前面的规则排序,若获取的钱不同则按照获取的钱多的在前面的规则排序
坑点
这道题的意思并不是抢一个红包,即一个人可以抢多次,也就是s数组里的名字有可能重复,此时就需要我们进行对s数组查重,如果前后名字一样,就将x里的金额相加
因此我们可以设置一个RepeatJudge函数判断名字是否重复,如果重复,返回该名字(第一次出现)的下标,并加上当前的金额。如果不重复返回-1,结构体正常加入新元素
C++代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct person //结构体
{
string name;
int money;
int num;
};
bool cmp(person p1,person p2) //判断函数
{
if(p1.money==p2.money) return p1.num<p2.num;
return p1.money>p2.money;
}
int RepeatJudge(string name,vector<person> p) //判断名字是否重复
{
for(int i=0;i<p.size();i++)
if(p[i].name==name) return i;
return -1;
}
vector<string> solution(int n, vector<string> s, vector<int> x)
{
vector<person> p; //结构体数组
for(int i=0;i<n;i++) //遍历s与x数组
{
int reNum = RepeatJudge(s[i],p);
if(reNum==-1) //如果reNum为-1则名字不重复,p加入新名字和对应金额与编号
{
p.push_back({s[i],x[i],i});
}
else //名字重复,只需加上金额即可
{
p[reNum].money+=x[i];
}
}
sort(p.begin(),p.end(),cmp); //排序
vector<string> res;
for(int i=0;i<p.size();i++)
res.push_back(p[i].name); //结果数组只存名字
return res; //返回结果
}
int main() //主函数
{
cout << (solution(4, {"a", "b", "c", "d"}, {1, 2, 2, 1}) == vector<string>{"b", "c", "a", "d"}) << endl;
cout << (solution(3, {"x", "y", "z"}, {100, 200, 200}) == vector<string>{"y", "z", "x"}) << endl;
cout << (solution(5, {"m", "n", "o", "p", "q"}, {50, 50, 30, 30, 20}) == vector<string>{"m", "n", "o", "p", "q"}) << endl;
cout << (solution(12, {"aa","aaaaaaa","aaaa","aaaa","aaaa","aaaaaaaaaa","aaaaaaaaa","aaaa","aaaaaaaaaa","aaaaaaaaa","aaaaa","aaaa"}, {17,14,11,2,8,16,14,17,10,6,5,12}) == vector<string>{"aaaa","aaaaaaaaaa","aaaaaaaaa","aa","aaaaaaa","aaaaa"}) << endl;
return 0;
}