Получив массив nums, напишите функцию, которая перемещает все 0 в его конец, сохраняя при этом относительный порядок ненулевых элементов.

Пример:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

Примечание.

  1. Вы должны сделать это на месте, не создавая копию массива.
  2. Минимизируйте общее количество операций.

Общая идея состоит в том, чтобы сканировать массив дважды.

При первом сканировании используйте два указателя: один указатель индекса для сохранения ненулевого подмассива (изменение исходного массива), другой индекс для циклического прохождения исходного массива. Если текущий проверяемый элемент равен 0, то пропустить; если это не 0, переместите его в ненулевой подмассив.

После первого раунда все ненулевые элементы должны быть сжаты в левую часть исходного массива. Итак, во втором раунде мы просто добавляем нули в пустые слоты.

public void moveZeroes(int[] nums) {
        if (nums.length == 0 || nums == null) return;
        int idx = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[idx++] = nums[i];
            }
        }
        while (idx < nums.length) {
            nums[idx++] = 0;
        }
        return;
    }