思路
- 一开始打算用map做,然后用vector<pair<string,int>>根据value值从大到小排序,结果未通过。
- 原因:map会自动排序,默认排序规则:先根据key值排序,key值若相同,则根据value值排序,这样会改变先后次序。
- 新思路:创建vector<pair<string,int>> t 数组建立每个人的名字和抽中红包值之间的映射关系,遍历一遍数组,因为同一个人可能抽中多个红包(一开始没注意),所以需要内嵌一重循环遍历t数组,若当前遍历对象是跟t数组已经存在,则增加当前对象的红包数额。
代码:
#include <iostream>
#include <vector>
#include <string>
#include<map>
#include<algorithm>
using namespace std;
bool cmp(pair<string,int> x,pair<string,int> y){
return x.second>y.second;
}
vector<string> solution(int n, vector<string> s, vector<int> x) {
vector<pair<string,int>> t;
t.push_back(pair<string,int>(s[0],x[0]));
for(int i=1;i<s.size();i++){
int f=0;
for(int j=0;j<t.size();j++){
if(t[j].first==s[i]){
t[j].second+=x[i];
f=1;
break;
}
}
if(f==0){
t.push_back(make_pair(s[i],x[i]));
}
}
sort(t.begin(),t.end(),cmp);
vector<string> ans;
for(int i=0;i<t.size();i++){
ans.push_back(t[i].first);
}
return ans;
}
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;
}