问题描述
小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。
问题思路解析
题目要求我们对多个参与抢红包的人进行排名,按照以下规则:
- 金额:抢到的金额越多,排名越靠前。
- 顺序:如果金额相同,按照抢红包的顺序进行排名。也就是说,先抢的排在前面。
为了实现这个目标,代码通过以下步骤来处理:
1. 定义数据结构:
我们需要一个合适的数据结构来存储每个人的抢红包信息。定义了一个结构体 mm 来存储以下信息:
string s:表示人的名字。int x:表示该人抢到的总金额。int ans:表示该人抢红包的顺序。
此外,我们还定义了一个 vector<mm> 来存储所有人的信息,以便最后进行排序。
2. 初始化数据:
我们使用了两个哈希表(unordered_map):
map:用于存储每个人的抢红包总金额,键是人的名字,值是总金额。map1:用于存储每个人的抢红包顺序,键是人的名字,值是该人第一次出现的顺序(即抢红包的顺序)。
通过遍历所有的抢红包数据(s 和 x),我们依次更新这些哈希表:
- 对于每个名字
s[i],我们将其对应的金额x[i]加到map中。 - 如果某个人第一次出现(即在
map1中还没有该名字),我们记录其出现的顺序。
3. 构造排序向量:
我们将 map 和 map1 中的信息转移到 vector<mm> 向量中。每一个 mm 结构体保存了一个人的名字、总金额和顺序。这个向量将用于后续的排序操作。
4. 排序:
排序的核心在于如何比较两个人的顺序:
- 先按金额排序:我们希望金额大的排在前面,所以按
x进行降序排序。 - 若金额相同,则按顺序排序:如果两个人的抢到金额相同,我们就需要根据他们的顺序来进行升序排序。这里我们使用
ans来表示抢红包的顺序。
我们使用了一个自定义的排序函数 cmp,其规则如下:
- 如果两个人的金额相同(
a.x == b.x),则按顺序(a.ans < b.ans)升序排列; - 否则,按金额(
a.x > b.x)降序排列。
5. 输出结果:
经过排序后,向量 arr 中的每个元素(mm)表示一个人的信息。我们将这些人的名字按排序后的顺序提取到一个新的 vector<string> 中,并返回这个结果。
6. 时间复杂度分析:
- 遍历输入的
s和x,需要 O(n) 的时间,其中n是输入的元素个数。 - 对
vector<mm>进行排序,使用了快速排序,时间复杂度为 O(n log n)。 - 总体的时间复杂度为 O(n log n),其中 n 是输入的元素个数。
完整代码
#include <vector>
#include <string>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
struct mm{
string s;
int x;
int ans;
};
bool cmp(mm a, mm b){
if(a.x==b.x){
return a.ans<b.ans;
}
return a.x>b.x;
}
vector<string> solution(int n, vector<string> s, vector<int> x) {
vector<mm> arr;
unordered_map<string, int> map;
unordered_map<string, int> map1;
for(int i=0;i<s.size();i++){
map[s[i]]+=x[i];
if(map1.find(s[i])==map1.end())
{
map1[s[i]]=i;
}
}
for(auto it=map.begin();it!=map.end();it++){
mm v;
v.s=it->first;
v.x=it->second;
v.ans=map1[it->first];
arr.push_back(v);
}
sort(arr.begin(),arr.end(),cmp);
vector<string> c;
for(int i=0;i<arr.size();i++){
cout<<arr[i].s<<" ";
c.push_back(arr[i].s);
}
// cout<<endl;
// write code here
return c;
}
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;
return 0;
}