Amazon.com学生最终得分

时间:2013-02-25 17:00:31

标签: java algorithm sorting amazon complexity-theory

这个问题是关于Amazon.com采访的在线测试。确切的问题是:

  

给出测试结果列表(每个测试结果都有测试日期,学生ID和学生的分数),返回每个学生的最终分数。学生的最终得分计算为他/她的5个最高考试成绩的平均值。您可以假设每个学生至少有5个考试成绩。

     

将以下骨架用于解决方案

class TestResult{
   int studentId;
   Date testDate;
   int testScore;
}

public Map<Integer, Double> getFinalScores(List<TestResult> resultList){
   return null;
}

我的解决方案是这样的:

  • 我创建了一个名为studentIdToResultSet的HashMap<Integer, SortedSet<TestResult>
  • 比较者会比较结果中的testScore,并返回1以获得更高的分数,以便从最高到最低排序。
  • 迭代给定的结果列表并将所有测试结果放入映射中(检查条目是否存在,如果是,则添加到set,如果没有:使用new set创建条目并将结果添加到列表中。
  • 迭代HashMap,对于每个条目,我迭代前5个集合条目并获得平均值,将其放在另一个HashMap中,我最终返回。

现在我的问题是:

  1. 我不知道我的解决方案的复杂性(O)是什么。我最好的猜测是它是O(n + n),但我不确定。
  2. 这个问题是否有更优化的解决方案?
  3. 如果我在问题中添加了约束,返回的地图必须按照学生排名的顺序迭代怎么办?
  4. P.S。我看到有人在@ Calculating the average?之前提出了这个问题,但他不太清楚,并没有提供骷髅。如果这违反了发布规则,我提前道歉。

2 个答案:

答案 0 :(得分:2)

使用大小为5的minHeap

复杂性:O(klogn),k = 5 ==&gt; O(LOGN)。而O(n + m),一般= O(max(n,m)。在你的情况下是O(n)。

答案 1 :(得分:1)

您的算法似乎具有O(nLog(n))时间复杂度。你的树可以有任何大小,包括在最坏的情况下n。您可以使用每个学生ID的最小堆,而不是使用树。每次向其添加第六个项目时,请删除之后的最小值,以便始终保持最佳的5个分数。

正如Droider所解释的那样,这样就可以保证n的线性时间。