Ако искате да правите стекове и имам предвид много от тях, ще ви покажа как в тази публикация. Има няколко различни начина, но аз ще ви покажа кои работят за мен и как да се уверя, че не губите време. И така, първо, какво е стек, това е вид структура от данни, която можете да визуализирате, като си представите купчина плочи, можете почти да подреждате типове данни един върху друг, стига да знаете, че последният запис на стекът ще бъде първият от стека. Създаването на стекове е доста просто, можете да .push() елемент в стек, което ще бъде O(1) операция с времева сложност, както и .pop() елемент извън стека, който има същата сложност.

Един пример за стекове, които се използват в ежедневния живот, би бил, когато сърфирате в интернет, всеки път, когато отидете на различен уебсайт, този уебсайт се избутва в стек, но ако искате да се върнете назад, можете да го извадите от стек, за да видите предишната уеб страница, на която сте били. Надявам се, че сте научили нещо за стекове и как да ги правите, като прочетете това, а сега към проблема с алгоритъма!

Функцията основно трябва да се извика с един вход, масив, който има цели числа. Същият масив ще бъде върнат, но с всички нулеви елементи в края и ненулевите елементи в началото. Пример би бил:

let nums = [ 0, 1, 0, 3, 12, 11, 0, 7];
// function returns
nums = [1, 3, 12, 11, 7, 0, 0, 0];

Няколко ограничения биха били, че не можете да направите копие на масива и трябва да минимизирате броя на операциите.

Започнах с итерация през масива и ако имаше ненулев елемент, той щеше да бъде преназначен на първия елемент в масива с помощта на втори брояч. За всяка итерация, която има ненулев елемент, вторият брояч ще се увеличи с единица. Ето един поглед към кода:

var moveZeroes = function(nums) {
  var laggingCount = 0;
  for (var i = 0; i < nums.length; i++) {
    if (nums[i] !== 0) {
      nums[laggingCount] = nums[i];
      nums[i] = laggingCount === i ? nums[i] : 0;
      laggingCount++;
    }
  }
};

Уведомете ме, ако имате въпроси или коментари, благодаря!