红包运气排行榜
问题描述
小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。
样例1:
输入:n = 4 ,s = ["a", "b", "c", "d"] ,x = [1, 2, 2, 1]
输出:['b', 'c', 'a', 'd']
误区:
开始以为一个人只能抢一次,用了结构体存储 人名 和 金额 再进行结构体排序(按照zhi的大小排序,其他的默认排序),最后依次输出人名,结果错误,看到未果案例的分析,应该是一个名字可以抢多次,后续按照这个思路写,结果过了
纠正:
想到了用map容器存储 人名 和 金额 ,但是map容器不能直接排序,我还是决定是用其他暴力方法
同样用结构体存储 人名(string s1) 和 金额(int zhi);遍历 s 容器,每一次都判断当前的字符串是否已经存入结构体数组,如果已经存在,更新 zhi 的值,进行下一个遍历;如果不存在,将该字符串和对应的值存入结构体数组。最后输出 人名
string s1;
int zhi;
};
bool cmp(node a, node b) { return a.zhi > b.zhi; }
vector<string> solution(int n, vector<string> s, vector<int> x) {
vector<node> arr;
int k=0;
for (int i = 0; i < n; i++) {
bool flag = false;
for (int j = 0; j < i; j++) {
if (arr[j].s1 == s[i]) {
arr[j].zhi += x[i];
flag = true;
break;
}
}
if (!flag) {
node temp ;
temp.s1=s[i];
temp.zhi=x[i];
arr.push_back(temp);
k++;
}
}
sort(arr.begin(), arr.end(), cmp);
vector<string> krr;
for (int i = 0; i < arr.size(); i++) {
krr.push_back(arr[i].s1);
}
return krr;
}
在网上看了下map的排序方法,还是决定学一下怎么写
用map容器的方法(参考CSDN上的作者————稻子永不倒)
把map里的数据(pair)存放在vector容器中 用sort()进行排序
return a.second>b.second;
}
vector<string> solution(int n, vector<string> s, vector<int> x) {
map<string,int>q;
for(int i=0;i<n;i++){
q[s[i]]+=x[i];
}
vector<string>kk;
vector<pair<string,int>>m(q.begin(),q.end());
sort(m.begin(),m.end(),cmp);
for(int i=0;i<m.size();i++){
kk.push_back(m[i].first);
}
return kk;
}
代码解释: vector<pair<string,int>>m(q.begin(),q.end())
vector 的构造函数的参数,它接受两个迭代器参数。q.begin()返回一个迭代器,指向 map q 的第一个元素,而 q.end() 返回一个迭代器,指向 map q 的末尾(即最后一个元素之后的位置)。
将 map q中的所有元素复制到新创建的vector m 中。map 中的每个键值对(key-value pair)都会被复制到 vector 中,作为一个 pair<string, int> 类型的元素
map使用补充:
map常用函数: 1.find():find(key)返回键是key的映射值
2.erase():删除元素。
3.size():用来获得map中映射多少个
4.clear():清空函数。
map容器还会根据键的大小来自动排序。
ai刷题一些感悟:
在这里刷题有一段时间了,最喜欢的就是利用ai获取即时反馈与错误分析,完成练习后,AI 能立即给出反馈,指出错误之处,并提供详细的解题思路和方法讲解,帮助我们迅速了解自己的问题所在,加深对知识点的理解,避免一错再错。
上述若有问题,欢迎友友指正!