Idea
记录caibi学习的第n天,这道题折磨了我两个多小时,终于用自己的思路ac了
大佬建议参考官方题解思路
用一个map记录学生id及其得分情况
用两个set存放 正面词汇集和负面词汇集
遍历report,然后获取每一个单词,跟两个set进行查找,若正面则map中该id学生得分+3,负面则-1
因为map中没用根据value排序的函数,我们将得到的map用vector存放,然后自定义vector排序规则
最后用答案数组取出vector前k个元素就好
AC Code
class Solution {
public:
vector<int> topStudents(vector<string>& positive_feedback, vector<string>& negative_feedback, vector<string>& report, vector<int>& student_id, int k) {
int n = student_id.size();
unordered_map<int, int> student_trans;
unordered_set<string> posSet;
unordered_set<string> negSet;
for(string s : positive_feedback) posSet.insert(s);
for(string s : negative_feedback) negSet.insert(s);
for(int i = 0; i < n; i++) {
string tmp = "";
student_trans[student_id[i]] = 0; // 因为上面的map没有初始化,若该生的得分一直为0的时候,后面将map传递给vector的时候,会出现nullptr的情况,因此这里需要先赋值0
for(int j = 0; j < report[i].size(); j++) {
if(report[i][j] == ' ') {
if(posSet.find(tmp) != posSet.end()) student_trans[student_id[i]] +=3;
if(negSet.find(tmp) != negSet.end()) student_trans[student_id[i]] -=1;
tmp = "";
continue;
}
tmp += report[i][j];
}
if(posSet.find(tmp) != posSet.end()) {
student_trans[student_id[i]] +=3;
}
if(negSet.find(tmp) != negSet.end()) student_trans[student_id[i]] -=1;
}
vector<pair<int,int>> student_transVec(student_trans.begin(),student_trans.end());
sort(student_transVec.begin(),student_transVec.end(),[&] (const auto& l, const auto& r){
// 如果value相等,比较key值
if (l.second == r.second)
return l.first < r.first;
else
// 否则比较value值
return l.second > r.second;
});
vector<int> ans;
for(int i = 0; i < k; i++) {
ans.emplace_back(student_transVec[i].first);
}
return ans;
}
};