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