当前位置:首页 > 编程笔记 > 正文
已解决

【力扣每日一题】2023.10.11 奖励最顶尖的k名学生

来自网友在路上 180880提问 提问时间:2023-10-11 12:25:16阅读次数: 80

最佳答案 问答题库808位专家为你答疑解惑

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们两个字符串数组,分别表示正面评价的单词和负面评价的单词。再给我们n个学生的评语,评语中有一个正面单词我们就加3分,有一个负面单词我们就减一分。最终要我们返回分数最高的前k个学生的id,如果分数一致则优先选取id小的学生。

大体思路就是我们直接模拟就好了,把每个评语的单词提取出,然后去寻找这个单词是否属于正面评价或是负面评价,对应的加分减分,最终按照题目要求排序即可。

我们需要快速的知道某个单词是否在正面单词或是负面单词中,那么我们就可以先把两个存放单词是数组转为set来方便我们查找。

提取出评价中的单词也好办,只需要将整个字符串按照空格来分割就好。

分数统计完毕之后再按照题目要求排序,取出前k个学生即可。

下面的代码看着多,其实核心思路就是我上面这一小段,代码显得臃肿主要是我代码水平不到位,这道题其实是不难的。

代码:

class Solution {
public:vector<int> topStudents(vector<string>& positive_feedback, vector<string>& negative_feedback, vector<string>& report, vector<int>& student_id, int k) {//将正面和负面的单词转为set方便后续查找unordered_set<string>good(positive_feedback.begin(),positive_feedback.end());unordered_set<string>bad(negative_feedback.begin(),negative_feedback.end());//map用来统计学生的分数unordered_map<int,int>m;vector<int>res;int n=report.size();for(int i=0;i<n;i++){m[student_id[i]]=0;string temp="";//提取评语中的每个单词for(char& c:report[i]){if(c!=' ') temp+=c;else{//提取出单词之后和好词坏词比较,对应地加分减分if(good.count(temp)) m[student_id[i]]+=3;else if(bad.count(temp)) m[student_id[i]]--;temp="";}}if(good.count(temp)) m[student_id[i]]+=3;else if(bad.count(temp)) m[student_id[i]]--;}vector<vector<int>>cache;//提取出每个学生的id以及分数for(auto& a:m){cache.push_back({a.first,a.second});}//按照题目要求排序sort(cache.begin(),cache.end(),[](auto& a,auto& b){if(a[1]!=b[1]) return a[1]>b[1];return a[0]<b[0];});//再将学生id取出for(auto& c:cache){//最多取出k名if(res.size()>=k) break;res.push_back(c[0]);}return res;}
};

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"【力扣每日一题】2023.10.11 奖励最顶尖的k名学生":http://eshow365.cn/6-18920-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!