49红包运气排行耪(易)

69 阅读1分钟

思路

  1. 一开始打算用map做,然后用vector<pair<string,int>>根据value值从大到小排序,结果未通过。
  2. 原因:map会自动排序,默认排序规则:先根据key值排序,key值若相同,则根据value值排序,这样会改变先后次序。
  3. 新思路:创建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;//判断当前元素在t数组中是否存在
        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;
}