2512. 奖励最顶尖的 K 名学生 【二元列表降序 取负。zip、列表哈希化】【C++ stringstream 空格分词】

37 阅读1分钟

2512. 奖励最顶尖的 K 名学生

class Solution:
    def topStudents(self, positive_feedback: List[str], negative_feedback: List[str], report: List[str], student_id: List[int], k: int) -> List[int]:
        words = {}  # 看起来 预处理更快
        for w in positive_feedback:
            words[w] = 3
        for w in negative_feedback:
            words[w] = -1
       
        arr = []
        for i, r in zip(student_id, report):
            score = sum(words.get(w, 0) for w in r.split())
            arr.append([-score, i])

        arr.sort()
        return [v[1] for v in arr[:k]]

image.png

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> words;
        for (auto word : positive_feedback){
            words[word] = 3;
        }  
        for (auto word : negative_feedback){
            words[word] = -1;
        }  
        vector<vector<int>> arr;
        for (int i = 0; i < report.size(); ++i){
            stringstream ss;  // 根据空格分词
            string w;
            int score = 0;
            ss << report[i];// 接收
            while (ss >> w){// 依次 输出
                if (words.count(w)){
                    score += words[w];
                }
            }
            arr.push_back({-score, student_id[i]}); //  取 反, 以及根据 遍历顺序 取 id 
        }
        sort(arr.begin(), arr.end());
        vector<int> top_k;
        for (int i = 0; i < k; ++i){
            top_k.emplace_back(arr[i][1]); // 存id 
        }
        return top_k;
    }
};