この質問は、Amazon.com の面接のオンライン テストに関するものでした。正確な質問は次のとおりです。
テスト結果のリスト (それぞれテスト日、学生 ID、および学生のスコアを含む) を指定して、各学生の最終スコアを返します。学生の最終スコアは、5 つの最高のテスト スコアの平均として計算されます。各生徒が少なくとも 5 つのテストの点数を持っていると想定できます。
ソリューションには次のスケルトンを使用してください
class TestResult{
int studentId;
Date testDate;
int testScore;
}
public Map<Integer, Double> getFinalScores(List<TestResult> resultList){
return null;
}
私の解決策は次のようになりました:
- 私は、
HashMap<Integer, SortedSet<TestResult>
studentIdToResultSet という名前を作成しました。 - Comparator は結果の testScore を比較し、スコアが高いほど 1 を返すため、最高から最低へと並べ替えられます。
- 指定された結果リストを反復処理し、すべてのテスト結果をマップに配置します (エントリが存在するかどうかを確認し、存在する場合: セットに追加し、存在しない場合: 新しいセットでエントリを作成し、結果をリストに追加します。
- HashMap を反復処理し、エントリごとに最初の 5 つのセット エントリを反復処理して平均を取得し、それを別の HashMap に入れ、それを最終的に返します。
ここに私の質問があります:
- ソリューションの複雑さ (O) がどの程度かはわかりません。私の最善の推測は、それが O(n+n) であるということですが、よくわかりません。
- この問題に対するより最適な解決策はありますか?
- 質問に制約を追加して、返されるマップが生徒のランキング順に繰り返されるようにするとどうなるでしょうか?
PS @平均を計算する前に誰かがこの質問をしているのを見ましたか? しかし、彼はまったく不明確で、骸骨を提供しませんでした。投稿ルールに反する場合は、あらかじめお詫び申し上げます。