描述
每個(gè)學(xué)生有兩個(gè)屬性 id 和 scores愉舔。找到每個(gè)學(xué)生最高的 5 個(gè)分?jǐn)?shù)的平均值炭晒。
樣例
給出 results = [[1,91],[1,92],[2,93],[2,99],[2,98],[2,97],[1,60],[1,58],[2,100],[1,61]]
返回:
1: 72.40
2: 97.40
代碼實(shí)現(xiàn)
/**
* Definition for a Record
* class Record {
* public int id, score;
* public Record(int id, int score){
* this.id = id;
* this.score = score;
* }
* }
*/
public class Solution {
/**
* @param results a list of <student_id, score>
* @return find the average of 5 highest scores for each person
* Map<Integer, Double> (student_id, average_score)
*/
public Map<Integer, Double> highFive(Record[] results) {
Map<Integer, Double> answers = new HashMap<>();
Map<Integer, PriorityQueue<Integer>> hash = new HashMap<>();
for (Record r : results) {
if(!hash.containsKey(r.id)) {
hash.put(r.id, new PriorityQueue<Integer>());
}
//不能加else,否則id第一次加出現(xiàn)入的數(shù)組中的成績(jī)無(wú)法加入隊(duì)列中
//else {
//這里的else可以的原因是if語(yǔ)句進(jìn)行了第二次判斷,由于第一次
//加入了受楼,如果原本hash不中存在的垦搬,此時(shí)肯定存在,便會(huì)將成績(jī)加入隊(duì)列
//當(dāng)然也可以省去這里的if語(yǔ)句
if (hash.containsKey(r.id)) {
PriorityQueue<Integer> pq = hash.get(r.id);
if (pq.size() < 5) {
pq.add(r.score);
} else {
if (pq.peek() < r.score) {
pq.poll();
pq.add(r.score);
}
}
}
}
//Map.Entry是Map的嵌套類(lèi)
// 使用Map.Entry是為了獲取每次遍歷時(shí)map的key和value艳汽,map沒(méi)有該方法的實(shí)現(xiàn)
//hash.entrySet()是為了匹配Map.Entry
for (Map.Entry<Integer, PriorityQueue<Integer>> map : hash.entrySet()) {
int id = map.getKey();
PriorityQueue<Integer> score = map.getValue();
double average = 0;
for (int i = 0; i < 5; i++) {
average += score.poll();
}
average /= 5.0;
answers.put(id, average);
}
return answers;
}
}