C++红包运气排行榜 | 豆包MarsCode AI刷题

39 阅读2分钟

题目

红包运气排行榜
问题描述

小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;
}