Выбор альтернативных позиций в очереди

Попытка объяснить это более описательно,

Операция 1:

x = [[0, 0], [0, 0]]
print(type(x)) # <class 'list'>
print(x) # [[0, 0], [0, 0]]

x[0][0] = 1
print(x) # [[1, 0], [0, 0]]

Операция 2:

y = [[0] * 2] * 2
print(type(y)) # <class 'list'>
print(y) # [[0, 0], [0, 0]]

y[0][0] = 1
print(y) # [[1, 0], [1, 0]]

Заметил, почему не изменяется первый элемент первого списка не изменил второй элемент каждого списка? Это потому, что [0] * 2 действительно представляет собой список из двух чисел, и ссылка на 0 не может быть изменена.

Если вы хотите создать копии клонов, попробуйте выполнить операцию 3:

import copy
y = [0] * 2   
print(y)   # [0, 0]

y = [y, copy.deepcopy(y)]  
print(y) # [[0, 0], [0, 0]]

y[0][0] = 1
print(y) # [[1, 0], [0, 0]]

еще один интересный способ создания копий клонов, операция 4:

import copy
y = [0] * 2
print(y) # [0, 0]

y = [copy.deepcopy(y) for num in range(1,5)]
print(y) # [[0, 0], [0, 0], [0, 0], [0, 0]]

y[0][0] = 5
print(y) # [[5, 0], [0, 0], [0, 0], [0, 0]]
-1
задан πάντα ῥεῖ 24 March 2019 в 08:06
поделиться

2 ответа

Ключ в постановке задачи: Из выбранных людей формируется очередь . Когда вы выбираете людей из q, не помещайте их обратно в одну очередь, а помещайте их в новую. Как только вы закончите с этим выбором, swap две очереди (чтобы заменить старую очередь новой очередью), прежде чем перейти к следующей итерации.

0
ответ дан 1201ProgramAlarm 24 March 2019 в 08:06
поделиться

Основная проблема заключается в том, что вы помещаете выбранные позиции в конец своей очереди, добавляя новую очередь к старой. Это сработало бы, если бы начало новой очереди соответствовало началу итерации вашего цикла while. Однако это не работает, если старая очередь имеет нечетную длину.

Следующим шагом для вашего подхода будет удаление последнего элемента из старой очереди, если длина нечетная. Это дает вам очередь равной длины, которая работает. Новая проблема состоит в том, чтобы выяснить, когда вы нашли начало новой очереди, чтобы вы могли повторить процесс (проверки на нечетную длину).

Один из способов сделать это - поместить значение часового в начало вашей очереди. Поэтому, когда вы строите свою начальную очередь, постройте ее с номерами от 0 до n вместо просто от 1 до n. Первое, что должен сделать ваш цикл, это проверить, равен ли фронт очереди нулю. Если это так, вставьте его, заставьте оставшуюся очередь иметь четную длину, а затем нажмите ноль в конце. После этого продолжайте в том же духе (pop, pop, push).


Менее загадочный подход заключается в использовании двух очередей вместо симуляции двух очередей.

Более быстрый подход заключается в удалении цикла и использовании формулы. (Какая формула? Это разумное упражнение по математике, поэтому я предоставлю вам возможность разобраться. Тем более, что исходная задача также является упражнением. Я просто упомяну, что математика включает в себя степени 2.)

0
ответ дан JaMiT 24 March 2019 в 08:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: