Sobes.tech
Back to questions
Middle
9

Как найти в строке максимальное целое число без использования регулярных выражений на Python?

Companies where asked
OZONOZON

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 или другое ожидаемое значение по контракту функции.
  • Для упрощения можно собирать все числа в список, а для экономии памяти — держать текущий максимум без хранения всех значений.