Итоговый балл Amazon.com

Этот вопрос касался онлайн-теста для интервью Amazon.com. Точный вопрос:

Учитывая список результатов теста (каждый с датой тестирования, идентификатором студента и счетом ученика), верните итоговый результат для каждого учащегося. Итоговый счет ученика рассчитывается как среднее из его 5 самых высоких результатов теста. Вы можете предположить, что у каждого учащегося есть как минимум 5 баллов.

     

Используйте следующие скелеты для своих решений

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

public Map getFinalScores(List resultList){
   return null;
}

Мое решение было таким:

  • I created a HashMap called studentIdToResultSet.
  • The Comparator would compare the testScore in the result, and return 1 for the higher score, so that it would sort highest to lowest.
  • Iterated over the given results list and put all the test results in the map (checked if entry exists, if yes : add to set, if no : create entry with new set and add the result in the list.
  • Iterated over the HashMap, for each entry I iterate over the first 5 set entries and get the average, put that in another HashMap, which I ultimately return.

Теперь вот мои вопросы:

  1. Я не знаю, что такое сложность (O) моего решения. Я думаю, что это O (n + n), но я не уверен.
  2. Есть ли более оптимальное решение этой проблемы?
  3. Что делать, если я добавил ограничение на вопрос, что возвращаемая карта должна итератировать в порядке ранжирования студентов?

Постскриптум Я видел, что кто-то задал этот вопрос до @ вычисления среднего? , но он был совершенно неясен и сделал не обеспечивают скелеты. Если это нарушает правила проводки, мои извинения заранее.

2
nl ja de
O (n + n) сводится к O (n)
добавлено автор Sotirios Delimanolis, источник
Почему сортировка?
добавлено автор SparKot, источник
Из списков? чтобы получить пять самых высоких результатов теста ... Окончательный результат должен быть «лучшим из пяти» сценариев ...
добавлено автор Eki, источник

2 ответы

Используйте minHeap размера 5.

Complexity : O(klogn) , k =5 ==> O(logn). And O(n+m) , in general = O(max(n,m) . In your case its O(n).

2
добавлено
Ты прав. Это правильный подход, который гарантирует постоянное время работы на кучу. Подобно.
добавлено автор Eyal Schneider, источник
@Droider: У меня был тот же вопрос. Я использовал реализацию priorityqueue в java. Я думаю, этого должно быть достаточно. так как размер приоритета будет 5 всегда.
добавлено автор tejas, источник
Первоначально куча пуста, мы имеем размер = 5. Каждый раз, когда мы видим отметки
добавлено автор h4ck3d, источник
@KartikeBhagat Рад помочь. Из какого колледжа вы?
добавлено автор h4ck3d, источник
Спасибо! Есть ли Java-реализация MinHeap? Я даже не думал писать свою собственную структуру. Кроме того, спасибо за разъяснение о сложности
добавлено автор Eki, источник
Нашел его, PriorityQueue. Теперь все имеет смысл. Еще раз спасибо, Дройдер.
добавлено автор Eki, источник

Кажется, ваш алгоритм имеет сложность времени O (nLog (n)). Ваши деревья могут иметь любой размер, в том числе n в худшем случае. Вместо использования деревьев вы можете использовать минимальную кучу для каждого студента. Каждый раз, когда вы добавляете к нему шестой элемент, удаляйте минимальное значение после этого, чтобы оно всегда содержало лучшие 5 баллов.

Таким образом, вы гарантируете линейное время в n, как объясняет Droider.

1
добавлено
@DoSparKot: я не вижу реального выигрыша при этой оптимизации (в частности, не с точки зрения временной сложности)
добавлено автор Eyal Schneider, источник
и отслеживать минимальное значение. Счет будет кандидатом на замещение, только если он больше установленного минимума.
добавлено автор SparKot, источник
да, это не влияет на временную сложность.
добавлено автор SparKot, источник
Спасибо за объяснение. Очень признателен!
добавлено автор Eki, источник
SEO chat
SEO chat
5 476 участник(ов)

Чат про SEO. Speak Russian! Др.чаты: @ppcchat @uiux_chat @devschat @smmhell Работа: @seohr Канал: @seolife Аудит: tpv.sr/1QoBSBb Стата: tpv.sr/1QoBMrK/ Запрещено: - мат и брань - команды ботам - реклама, вакансии - религия, политика, наркота, крипта

pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async