题目描述
给出一组学生的名字以及他们的成绩,求最高的平均分(一位学生可能有多门课成绩)
样例
例 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:
- 定义存放姓名对应的数据的变量。
格式如下: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 })