AI 刷题 49. 红包运气排行榜 题解 | 豆包MarsCode AI刷题

132 阅读3分钟

问题描述

小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。

问题思路解析

题目要求我们对多个参与抢红包的人进行排名,按照以下规则:

  1. 金额:抢到的金额越多,排名越靠前。
  2. 顺序:如果金额相同,按照抢红包的顺序进行排名。也就是说,先抢的排在前面。

为了实现这个目标,代码通过以下步骤来处理:


1. 定义数据结构

我们需要一个合适的数据结构来存储每个人的抢红包信息。定义了一个结构体 mm 来存储以下信息:

  • string s:表示人的名字。
  • int x:表示该人抢到的总金额。
  • int ans:表示该人抢红包的顺序。

此外,我们还定义了一个 vector<mm> 来存储所有人的信息,以便最后进行排序。


2. 初始化数据

我们使用了两个哈希表(unordered_map):

  • map:用于存储每个人的抢红包总金额,键是人的名字,值是总金额。
  • map1:用于存储每个人的抢红包顺序,键是人的名字,值是该人第一次出现的顺序(即抢红包的顺序)。

通过遍历所有的抢红包数据(sx),我们依次更新这些哈希表:

  • 对于每个名字 s[i],我们将其对应的金额 x[i] 加到 map 中。
  • 如果某个人第一次出现(即在 map1 中还没有该名字),我们记录其出现的顺序。

3. 构造排序向量

我们将 mapmap1 中的信息转移到 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;
}