Дублирование нулей в массиве, освобождая место, сдвигая буквы

#python

#python

Вопрос:

Я работаю над проблемой, которая будет принимать этот ввод:

 [1, 0, 2, 3, 0, 4, 5, 0]
  

И выведите это:

 [1, 0, 0, 2, 3, 0, 0, 4]
  

Моя функция обнаруживает нули, и когда ноль является i-м элементом списка, i 1 он также становится нулем, а остальная часть списка сдвигается, чтобы освободить для него место. Элементы в конце списка выталкиваются, чтобы освободить место.

Я смог сделать это с помощью двух for циклов, но это имеет O(n^2) место, и я хочу это сделать O(n) . Я придумал это:

 new = [0] * len(arr)
zeroes = 0
d = 0
  

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

Сначала я считаю нули:

 for i in range(len(arr)):
    if arr[i] == 0:
        zeroes =1  
  

Затем я копирую. Я проверяю по индексу, что значение равно нулю, и если это так, я пропускаю d-й и d 1-й элемент.

 for i in range(len(arr)-zeroes):
    if arr[i] == 0:
        d =1
    else:
        new[d] = arr[i]
    d =1
  

Однако для:

 [1, 0, 2, 3, 0, 4, 5, 0]
  

Результат:

 [1, 0, 0, 2, 3, 0, 0, 0]
  

Я не уверен, почему последний элемент не меняется.

Комментарии:

1. Поскольку вы используете только range(len(arr)-zeroes) время цикла, следовательно, последние значения не заданы

2. @yatu это то, что я подумал, но если я изменю на (len(arr)-нули 1), это не будет работать для списков без нулей.

Ответ №1:

Вот более простое решение, которое по-прежнему является O (n):

 a = [1,0,2,3,0,4,5,0]
b = []
for i in a:
    b.append(i)
    if i == 0:
        b.append(0)
b = b[:len(a)]
  

Значение b будет

 [1, 0, 0, 2, 3, 0, 0, 4]