Новости IT, Tech-лайфхаки & Кодинг

Пример решения задачи #8. Python LeetCode, String to Integer (atoi)

Опубликовано: 13.04.2025, 12:08 | Автор: HDHai

Вариант решения задачи на Python с LeetCode

Категория: Алгоритмы.
Название задачи: String to Integer (atoi).
Сложность: Средняя.
Статус решения: "Решено".

Условие задачи:
Реализуйте функцию myAtoi(string s), которая преобразует строку в 32-битное целое число со знаком.

Алгоритм для myAtoi(string s) выглядит следующим образом:

1. Пробелы: Игнорируйте любые начальные пробелы (" ").
2. Знак числа: Определите знак числа, проверив, является ли следующий символ '-' или '+'. Если ни один из символов не присутствует, предполагается положительное число.
3. Преобразование: Считайте число, пропуская ведущие нули, пока не встретится нецифровой символ или не будет достигнут конец строки. Если цифры не были прочитаны, результат равен 0.
4. Округление: Если число выходит за пределы диапазона 32-битного целого числа со знаком [-2^31, 2^31 - 1], округлите его до ближайшей границы диапазона:
- Числа меньше -2^31 округляются до -2^31.
- Числа больше 2^31 - 1 округляются до 2^31 - 1.
5. Возвращайте полученное целое число как окончательный результат.

Решение:


Python

class Solution(object):
    def myAtoi(self, s):
        """
        :type s: str
        :rtype: int
        """
        # Удаляем начальные пробелы
        i = 0
        while i < len(s) and s[i] == ' ':
            i += 1
        
        # Определяем знак числа
        sign = 1  # По умолчанию положительное число
        if i < len(s) and (s[i] == '+' or s[i] == '-'):
            sign = -1 if s[i] == '-' else 1
            i += 1
        
        # Читаем цифры и формируем число
        result = 0
        while i < len(s) and s[i].isdigit():
            result = result * 10 + int(s[i])  # Добавляем очередную цифру к результату
            i += 1
        
        # Применяем знак к результату
        result *= sign
        
        # Проверяем выход за границы 32-битного целого числа
        INT_MIN, INT_MAX = -2**31, 2**31 - 1
        if result < INT_MIN:
            return INT_MIN
        if result > INT_MAX:
            return INT_MAX
        
        # Возвращаем результат
        return result


Объяснение кода

Удаление начальных пробелов:
Мы используем цикл while, чтобы пропустить все пробельные символы в начале строки. Это соответствует первому шагу алгоритма.

Определение знака числа:
Если после пробелов встречается символ '+' или '-', мы определяем знак числа. Если символ '-', то знак становится отрицательным (sign = -1), иначе остаётся положительным (sign = 1).

Чтение цифр:
Мы читаем последовательность цифр, начиная с текущей позиции. Для каждой цифры обновляем значение переменной result, добавляя её к текущему числу. Это делается путём умножения текущего значения result на 10 и прибавления новой цифры.

Применение знака:
После завершения чтения цифр мы умножаем результат на sign, чтобы применить знак к числу.

Проверка на переполнение:
Мы проверяем, попадает ли результат в диапазон 32-битных целых чисел ([-2^31, 2^31 - 1]). Если число выходит за пределы этого диапазона, мы возвращаем ближайшее допустимое значение (INT_MIN или INT_MAX).

Возврат результата:
Если число находится в допустимом диапазоне, мы возвращаем его как результат.

Пример работы:
Input: s = "42"
Output: 42

Источник решения: hdhai.com