Как найти в строке максимальное целое число без использования регулярных выражений на Python
Что проверяют
Умеете ли вы пройти строку за один проход и продумать крайние случаи, а не подобрать встроенный метод. Следом почти всегда спрашивают про отрицательные числа, числа, склеенные с буквами, и про то, что возвращать, если чисел нет.
Как отвечать
Начните с уточнения условий: считается ли abc123def числом 123, учитывается ли минус, что делать с ведущими нулями. Вариант через split() и isdigit() ломается уже на "цена:120руб", поэтому основное решение это посимвольный проход с накоплением:
def max_int(s: str) -> int | None:
best, cur, neg = None, "", False
for ch in s + " ":
if "0" <= ch <= "9":
cur += ch
continue
if cur:
n = -int(cur) if neg else int(cur)
best = n if best is None or n > best else best
cur = ""
neg = ch == "-"
return bestПроговорите ключевые моменты:
- сложность: O(n) по времени, одна переменная под текущее число;
- сторож в конце: пробел после строки закрывает последнее число без дублирования кода после цикла;
- минус: учитывается, только если стоит сразу перед цифрами. Как читать
5-3, уточните у интервьюера; - нет чисел: возвращается
None. Значение-1как признак отсутствия не годится, если допустимы отрицательные числа.
Для data-ml свяжите задачу с практикой: так чистят грязные текстовые поля перед построением признаков, и крайние случаи там те же.
Где спотыкаются
Используют str.isdigit(). Он возвращает True для надстрочных символов вроде '²', а int('²') падает с ValueError. Надёжнее сравнение с диапазоном ASCII-цифр или str.isdecimal().
Забывают про очень длинные числа. В актуальных версиях Python int() отказывается разбирать десятичную строку длиннее 4300 цифр, пока лимит не поднят через sys.set_int_max_str_digits. Если такое возможно, числа сравнивают как строки: сначала по длине без ведущих нулей, потом лексикографически.
Возвращают -1 или 0, когда чисел нет, и путают отсутствие результата с настоящим значением.