Перемещение нулей в конец списка

Реализуйте функцию moveZeroesToEnd, которая принимает на вход список целых чисел и перемещает все нули в конец списка, сохраняя порядок остальных элементов.

Требования:

  • Функция должна работать "in-place", то есть не должна использовать дополнительную память для хранения списка.
  • Порядок ненулевых элементов должен быть сохранён.

Примеры

// Пример 1:
val input1 = mutableListOf(0, 1, 0, 3, 12)
moveZeroesToEnd(input1)
Assert.assertEquals(listOf(1, 3, 12, 0, 0), input1)
// Объяснение: Все нули перемещены в конец списка, порядок ненулевых элементов (1, 3, 12) сохранён.

// Пример 2:
val input2 = mutableListOf(0, 0, 1)
moveZeroesToEnd(input2)
Assert.assertEquals(listOf(1, 0, 0), input2)
// Объяснение: Один ненулевой элемент (1) перемещён в начало списка, нули перемещены в конец.

// Пример 3:
val input3 = mutableListOf(0, 0, 0)
moveZeroesToEnd(input3)
Assert.assertEquals(listOf(0, 0, 0), input3)
// Объяснение: В списке только нули, поэтому никаких изменений не требуется.

Решение

fun moveZeroesToEnd(nums: MutableList<Int>) {
    var lastNonZeroIndex = 0

    for (i in nums.indices) {
        if (nums[i] != 0) {
            nums[lastNonZeroIndex] = nums[i]
            lastNonZeroIndex++
        }
    }

    for (i in lastNonZeroIndex until nums.size) {
        nums[i] = 0
    }
}

Объяснение решения:

  1. Инициализируем переменную lastNonZeroIndex на нуле. Она будет указывать на место, куда следует переместить следующий ненулевой элемент.
  2. Проходим по всему списку. Если текущий элемент ненулевой, то перемещаем его на место, указываемое lastNonZeroIndex, и увеличиваем значение этой переменной.
  3. После того как все ненулевые элементы перемещены, оставшуюся часть списка заполняем нулями.