Перебирайте версии в заданном порядке и остановитесь на первом True от is_bad_version. Верните срез до этой позиции; если дефектов нет, верните копию всего списка.
Отбор корректных версий ПО до первой проблемной
Перебирайте версии в заданном порядке и остановитесь на первом True от is_bad_version. Верните срез до этой позиции; если дефектов нет, верните копию всего списка.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан массив версий программного обеспечения, среди которых одна (или более) может быть дефектной. Существует функция is_bad_version(version) — возвращающая True, если переданная версия содержит ошибку, и False в противном случае. Требуется реализовать функцию, получающую список версий и возвращающую новый список, состоящий из всех элементов, предшествующих первой найденной ошибочной версии (саму ошибочную версию и все последующие элементы включать не нужно).
Пример 1: Ввод: versions = ["1.0", "1.1", "1.2"], при этом is_bad_version("1.1") = True. Вывод: ["1.0"]
Пример 2: Ввод: versions = ["2.0", "2.1", "2.2"], при этом is_bad_version("2.0") = True. Вывод: []
Ответ
Перебирайте версии в заданном порядке и остановитесь на первом True от is_bad_version. Верните срез до этой позиции; если дефектов нет, верните копию всего списка.
Линейный вариант не требует монотонности дефектов:
def versions_before_bad(versions):
for index, version in enumerate(versions):
if is_bad_version(version):
return versions[:index]
return versions.copy()
При дефекте первой версии результат пуст. Порядок списка сохраняется, строки версий не сортируются. Бинарный поиск допустим только при дополнительной гарантии, что после первой плохой версии все последующие тоже плохие. В данном условии такой гарантии нет, поэтому подменять проход бинарным поиском нельзя.