Рубрики
Без рубрики

Решение движения по Zeroes Challenge в Python

Некоторое время назад мой коллега и я обсуждали очень интересный вопрос о структурах данных и … Tagged с помощью Python, алгоритмов, Codequality.

Некоторое время назад мой коллега и я обсуждали очень интересный вопрос о структурах данных и алгоритмах. Этот вопрос задан 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 и я Затем переместите каждого из них вперед.

  1. Затем мы возвращаем наш первоначальный массив.

Если мы запустим эту логику, статистика: что прилично, если что -то должно пройти. Спасибо, что прочитали и увидимся на следующем.

Оригинал: “https://dev.to/nick_langat/solving-the-move-zeroes-challenge-in-python-2hf0”