lintcode-1483 · 最高平均分

简介: 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
})

相关文章
【AcWing每日一题】3443. 学分绩点
【AcWing每日一题】3443. 学分绩点
62 0
|
算法
《蓝桥杯每日一题》二分·AcWing 1460. 我在哪?
《蓝桥杯每日一题》二分·AcWing 1460. 我在哪?
46 0
|
人工智能 BI
《蓝桥杯每日一题》并查集·AcWing1249. 亲戚
《蓝桥杯每日一题》并查集·AcWing1249. 亲戚
44 0
【蓝桥杯集训·每日一题】AcWing 3792. 质数问题
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 筛质数 埃氏筛法 线性筛法
79 0
【蓝桥杯集训·每日一题】AcWing 3382. 整数拆分
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 背包DP
73 0
|
存储 机器学习/深度学习 算法
【蓝桥杯集训·每日一题】AcWing1394. 完美牛棚
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 匈牙利算法
136 0
|
存储 人工智能
【蓝桥杯集训·每日一题】AcWing 1051. 最大的和
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 线性DP
87 0
|
机器学习/深度学习
【蓝桥杯集训·每日一题】AcWing 4496. 吃水果
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 求组合数
65 0
|
移动开发 决策智能
【蓝桥杯集训·每日一题】AcWing 4005. 取石子游戏
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 1. 正解 2. 打表找规律 2、时间复杂度 3、代码详解 三、知识风暴 博弈论
118 0
|
人工智能
【蓝桥杯集训·每日一题】AcWing 3956. 截断数组
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 一维前缀和
54 0