В рамках недавнего заявления о приеме на работу меня попросили написать решение этой проблемы.
Учитывая,
- n = количество людей, стоящих в кругу.
- k = количество людей, на которое нужно рассчитывать каждый раз
Каждому человеку присваивается уникальный (инкрементный) идентификатор. Начиная с первого человека (самый низкий идентификатор), они начинают считать от 1 до k.
Человек в k тогда удален, и круг закрывается. Следующий оставшийся человек (после выбывшего) возобновляет счет с 1. Этот процесс повторяется до тех пор, пока не останется только один человек, победитель.
Решение должно предоставить:
- идентификатор каждого человека в порядке их удаления из круга
- идентификатор победителя.
Ограничения производительности:
- Используйте как можно меньше памяти.
- Сделайте так, чтобы решение работало как можно быстрее.
Я вспомнил, как делал что-то похожее в моем курсе CS несколько лет назад, но не мог вспомнить подробности во время этого теста. Теперь я понимаю, что это хорошо известная классическая проблема с несколькими решениями. (Я пока не буду упоминать это по имени, так как некоторые могут просто ответить «википедией»).
Я уже отправил свое решение, поэтому я абсолютно не ищу людей, которые бы ответили за него. Я предоставлю это чуть позже один раз / если другие предоставят некоторые ответы.
Моя главная цель задать этот вопрос - увидеть, как мое решение сравнивается с другими, учитывая требования и ограничения.
(Обратите внимание на требования, поскольку я думаю, что они могут сделать недействительными некоторые «классические» решения.)