Как изменится поведение функции при изменении условия сравнения?
Что проверяют
Вопрос почти всегда задают над конкретным куском кода: поиском максимума, бинарным поиском, сортировкой с ключом. Интервьюер хочет увидеть, что вы умеете проследить границы и крайние случаи, а не просто сказать «результат станет противоположным». Следом обычно просят придумать тест, который отличит старую версию функции от новой.
Как отвечать
Идите от входов, на которых поведение расходится. При замене < на <= это ровно равные значения, поэтому сразу проговорите, что происходит на них:
- выбор при равенстве: в цикле поиска максимума
if x > bestоставляет первый из одинаковых элементов,if x >= bestоставляет последний. Встроенныеmax()иmin()возвращают первый; - границы циклов: в бинарном поиске
while lo < hiиwhile lo <= hiтребуют разного пересчёта,hi = midилиhi = mid - 1. Поменяли одно без другого, получили пропуск элемента или бесконечный цикл; - off-by-one:
range(n)противrange(n + 1),i < len(a)противi <= len(a)сIndexErrorна последнем шаге; - сортировка:
sorted()сравнивает через__lt__и стабильна, порядок равных элементов сохраняется. Смена ключа илиreverse=Trueменяет результат, а старую функцию-компаратор подключают черезfunctools.cmp_to_key; - особые значения:
float('nan')на любое сравнение отвечаетFalse, так чтоx > bestиnot x <= bestдля NaN дают разное. Сравнениеintиstrв Python 3 бросаетTypeError; ==противis: первое сравнивает значения, второе идентичность объектов, иisуместен только сNoneи другими синглтонами.
Сложность от смены оператора обычно не меняется, меняются корректность и выбор среди равных. Закончите тестом на граничные входы: пустой список, один элемент, все элементы равны.
Где спотыкаются
Отвечают общими словами «функция вернёт другое» и не называют конкретный вход, на котором версии расходятся. Интервьюер ждёт именно пример.
Забывают про равенство. Большинство багов от замены < на <= проявляются только на одинаковых значениях, которых в удобных тестах нет.
Сравнивают дробные числа через ==. Для 0.1 + 0.2 == 0.3 получится False, нужен math.isclose().