天天看點

lintcode-1483 · 最高平均分

題目描述

給出一組學生的名字以及他們的成績,求最高的平均分(一位學生可能有多門課成績)

樣例

例 1:

輸入:names = ["bob","ted","ted"]
grades=[88,100,20]
輸出:88      

例 2:

輸入: names = ["john","xisa","xisa","liajd","alice","john","xisa","mark","ted","xlisa"]
grades = [95,83,33,50,78,91,80,67,85,87]
輸出:93      

題意

每個都可能多1-n門課的成績,計算學生的平均成績,取出最高的學生成績

解法1:

  1. 定義存放姓名對應的資料的變量。

    格式如下:nameTogrades

    姓名:n門課程,總成績

{ bob: [ 1, 88 ], ted: [ 2, 120 ] }      

周遊姓名清單,得到上面的格式資料。

2. 周遊得到的nameTogrades,用總成績除以課程數,得到每個人的平均數。

3. 周遊平均數,得到最高的平均成績。

export class Solution {

  /**
   * maximumAverageScore
   *
   * @param names: the name
   * @param grades: the grade
   * @return: the maximum average score
   */
  maximumAverageScore(names, grades) {
    // Write your code here
    let nameTogrades = {}
    /*
    * names1:[countTimes,countGrades],
    * names2:[countTimes,countGrades],
    * .......
    */
        
    for(let i = 0; i <names.length; i++){
        if(nameTogrades[names[i]]){
            // 如果已經存在相同變量 存儲結果相加
            nameTogrades[names[i]] = [nameTogrades[names[i]][0]+1,grades[i]+nameTogrades[names[i]][1]]
        }else{
            nameTogrades[names[i]] = [1,grades[i]]
        }
    };
    
    let times =0;
    for ( let key in nameTogrades ) {
        times += nameTogrades[key][0]
    }
    for ( let key in nameTogrades){
        nameTogrades[key] = nameTogrades[key][1]/nameTogrades[key][0]
    }
    
    let arr = [];
    for ( let key in nameTogrades){
        arr.push(nameTogrades[key])
    }
    
    return Math.max.apply(Math,arr.map(item=>{return item}))
  }

}
      

解法二

思路跟1差不多,這裡使用了es6的map結構,每次周遊的時候,記錄下課程數和到目前為止的總成績,最後在周遊找出最大值。

let map = new Map()
let max = 0
for (let i = 0; i < names.length; i++) {
     if (map.has(names[i])) {
          let data = map.get(names[i])
          map.set(names[i], [data[0] + 1, data[1] + grades[i]])

     } else {
          map.set(names[i], [1, grades[i]])
     }
}
map.forEach(item => {
     let temp = item[1] / item[0]
     max = max > temp ? max : temp

})
      

繼續閱讀