Основная проблема заключается в том, что вы помещаете выбранные позиции в конец своей очереди, добавляя новую очередь к старой.Это будет работать, если начало новой очереди соответствует началу итерации вашего цикла while
.Однако это не работает, если старая очередь имеет нечетную длину.
Следующим шагом для вашего подхода будет удаление последнего элемента из старой очереди, если длина нечетная.Это дает вам очередь равной длины, которая работает.Новая проблема состоит в том, чтобы выяснить, когда вы нашли начало новой очереди, чтобы вы могли повторить процесс (проверки на нечетную длину).
Один из способов сделать это - поместить значение часовогов начале вашей очереди.Поэтому при построении исходной очереди создайте ее с номерами от 0
до n
вместо просто 1
до n
.Первое, что должен сделать ваш цикл, это проверить, равен ли фронт очереди нулю.Если это так, вставьте его, заставьте оставшуюся очередь иметь четную длину, а затем нажмите ноль в конце.После этого продолжайте в том же духе (pop, pop, push).
Менее загадочный подход состоит в использовании двух очередей вместо симуляции двух очередей.
Более быстрый подходбудет удалить цикл и использовать формулу.(Какая формула? Это разумное математическое упражнение, поэтому я оставлю это вам на усмотрение. Тем более, что исходная задача также является упражнением. Я просто упомяну, что математика включает в себя степени 2.)