Некоторое время назад мой коллега и я обсуждали очень интересный вопрос о структурах данных и алгоритмах. Этот вопрос задан LeetCode Наши мысли были на разных способах, которые мы попытались бы прийти к сведению решения во всех данных. Чтобы дать вам перспективу, вот проблема проблемы: Учитывая целочисленное массив Nums
, переместить все 0 до конца этого при сохранении относительного порядка ненулевых элементов.
Примечание что вы должны сделать это на месте, не делая копию массива. Так что, если у нас есть список таких чисел, как:
nums=[8,0,3,5,0,4]
Мы перемещаем все 0 к концу, сохраняя при этом ненулевые числа, так что:
nums=[8,3,5,4,0,0]
Первое решение, которое не очень оптимально и сломало бы на месте
Ограничением было бы сделать копию массива и вставить ненулевые элементы с помощью:
nums=[8,0,3,5,0,4] def move_zeroes(): zeroes=[] non_zeroes=[] for i in nums: if i ==0: zeroes.append(i) for i in nums: if i !=0: non_zeroes.append(i) print(non_zeroes + zeroes)
Это огромный кусок, так что можем ли мы немного поднять его? Конечно, используя понимание списков, такое, что:
def move_zeroes(): pri nt([i for i in nums if i !=0]+[i for i in nums if i ==0])
Но это не было бы лучшим решением, так как нам нужно использовать постоянное пространство, и наш петля здесь не подходит. Мы можем опираться на то, что у нас уже есть, и не использовать для цикла, но менять промежуточные элементы при проверке их ценностей. Мы можем достичь этого, используя два указателя i
и Дж
. я
Будет нашим самым медленным указателем, пока J
быстрейший. Давайте построим эту логику битом:
def move_zeroes(): length=len(nums) # print(length) i=j=0
Итак, мы сначала получаем длину нашего массива и храним его в переменной. Затем мы инициализируем наши указатели и назначаем их 0 для начала. После этого мы можем:
def move_zeroes(): length=len(nums) # print(length) i=j=0 while j < length: if nums[j]==0: j +=1 else: nums[i],nums[j]=nums[j],nums[i] j +=1 i +=1 print(nums)
Итак, мы будем отслеживать J
Наш самый быстрый указатель. Пока это находится в длине нашего массива: 1. Мы проверяем его значение, если оно равно нулю. Если это так, мы перемещаем позицию указателя вперед на 1. 2. Если J
Не нуль, тогда мы поменяем J
и я
Затем переместите каждого из них вперед.
- Затем мы возвращаем наш первоначальный массив.
Если мы запустим эту логику, статистика: что прилично, если что -то должно пройти. Спасибо, что прочитали и увидимся на следующем.
Оригинал: “https://dev.to/nick_langat/solving-the-move-zeroes-challenge-in-python-2hf0”