题目:奖励最顶尖的 K 名学生
题目描述
给你两个字符串数组 positive_feedback 和 negative_feedback ,分别包含表示正面的和负面的词汇。不会 有单词同时是正面的和负面的。
一开始,每位学生分数为 0 。每个正面的单词会给学生的分数 加 3 分,每个负面的词会给学生的分数 减 1 分。
给你 n 个学生的评语,用一个下标从 0 开始的字符串数组 report 和一个下标从 0 开始的整数数组 student_id 表示,其中 student_id[i] 表示这名学生的 ID ,这名学生的评语是 report[i] 。每名学生的 ID 互不相同。
给你一个整数 k ,请你返回按照得分 从高到低 最顶尖的 k 名学生。如果有多名学生分数相同,ID 越小排名越前。
思路
- 题目不难,只需要对比各个词出现次数就可以
- 对于不同语言来说上面的可能有一定难度
- 所以写了一版C++的split(是用输入流实现的)
代码
class Solution {
public:
vector<int> topStudents(vector<string>& positive_feedback, vector<string>& negative_feedback, vector<string>& report, vector<int>& student_id, int k) {
unordered_map<string,int>score;
vector<pair<int,int>>list;//直接嵌套vector的时间效率不如pair
for (auto word:positive_feedback) score[word]=3;
for (auto word:negative_feedback) score[word]=-1;
for (int i=0;i<student_id.size();i++){
string words=report[i];
int id=student_id[i];
int s=0;
string key;
istringstream is(words);//将字符转成输入流然后操作
while(getline(is,key,' ')){
if (score.count(key))
//key不存在时int默认为0,但是那样效率不
s+=score[key];如判断高
}
list.emplace_back(make_pair(id,s));
}
sort(list.begin(),list.end(),[&](const pair<int,int>a,const pair<int,int>b){
return a.second>b.second ||(a.second==b.second&&a.first<b.first);
});
vector<int>res;
for (int i=0;i<k;i++){
res.emplace_back(list[i].first);
}
return res;
}
};
Python版本
class Solution:
def topStudents(self, positive_feedback: List[str], negative_feedback: List[str], report: List[str], student_id: List[int], k: int) -> List[int]:
sc=defaultdict(int)
for w in positive_feedback:
sc[w]=3
for w in negative_feedback:
sc[w]=-1
cores=[]
for rep,id_ in zip(report,student_id):
core=0
for word in rep.split():
core+=sc[word]
cores.append((core,id_))
cores.sort(key=lambda x:(-x[0],x[1]))
return [id_ for _,id_ in cores[:k]]