Как найти в строке максимальное целое число без использования регулярных выражений на Python?
Answer from AI
sobes.tech AI
Что хотят услышать интервьюеры:
Нужно уметь пройти по строке и вручную выделять последовательности цифр без re. Обычно ожидают решение за один проход, с корректной обработкой пробелов, знака - и нескольких чисел в строке. Важно показать, что понимается разница между поиском токенов и парсингом символ за символом.
Определение:
Максимальное целое число в строке можно найти, если последовательно сканировать символы, собирать подряд идущие цифры в текущий токен и при завершении токена преобразовывать его в int. Если в строке встречается знак минуса, его нужно учитывать только если он стоит перед цифрами и относится к числу, а не является просто символом в тексте. Затем из всех найденных целых чисел выбирается максимальное.
Пример использования:
def max_int_in_string(s: str):
numbers = []
current = ""
sign = 1
in_number = False
for i, ch in enumerate(s):
if ch.isdigit():
current += ch
in_number = True
else:
if in_number:
numbers.append(sign * int(current))
current = ""
sign = 1
in_number = False
if ch == '-' and i + 1 < len(s) and s[i + 1].isdigit():
sign = -1
if in_number:
numbers.append(sign * int(current))
return max(numbers) if numbers else None
text = "abc -12 def 7 ghi 105 jkl -3"
print(max_int_in_string(text)) # 105
Пояснение кода:
Код не требуется, но логика такая: строка обходитcя слева направо, символы цифр накапливаются в current, а как только встречается нецифровой символ, текущее число завершаетcя и добавляется в список numbers. Если перед цифрами стоит -, то число сохраняется отрицательным. В конце из собранных чисел выбирается max, а если чисел нет, возвращается None.
Ключевые моменты:
- Решение можно сделать за один проход по строке:
O(n). - Без регулярных выражений удобно использовать посимвольный разбор через
isdigit(). - Нужно отдельно обработать отрицательные числа, если они допустимы по условию.
- Важно не забыть добавить последнее число после завершения цикла.
- Если чисел нет, лучше вернуть
Noneили другое ожидаемое значение по контракту функции. - Для упрощения можно собирать все числа в список, а для экономии памяти — держать текущий максимум без хранения всех значений.