Используйте два индекса: чтение проходит весь массив, запись уплотняет нечётные элементы в его начале. Затем удалите оставшийся хвост.
Функция, исключающая чётные элементы из массива
Используйте два индекса: чтение проходит весь массив, запись уплотняет нечётные элементы в его начале. Затем удалите оставшийся хвост.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте функцию, которая удаляет из переданного массива все чётные числа, при этом не используя дополнительный массив и не прибегая к функциям высшего порядка.
Ответ
Используйте два индекса: чтение проходит весь массив, запись уплотняет нечётные элементы в его начале. Затем удалите оставшийся хвост.
func removeEven(_ values: inout [Int]) {
var write = 0
for read in values.indices {
if values[read] % 2 != 0 {
values[write] = values[read]
write += 1
}
}
values.removeLast(values.count - write)
}
Порядок оставшихся чисел сохраняется; отрицательные нечётные числа тоже проходят проверку. Алгоритм линейный и не создаёт дополнительный массив или closure высшего порядка. У Swift Array действует copy-on-write: при разделяемом буфере сама мутация может вызвать копирование хранилища, что не отменяет отсутствия второго массива в алгоритме.