Написано: 25.02.2023

8. Преобразование строки в целое число (String to Integer (atoi))

medium

Задание.

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

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

Читайте и игнорируйте любые начальные пробелы.

Проверьте, является ли следующий символ (если он еще не находится в конце строки) ‘-‘ или ‘+’. Прочтите этот символ в, если это либо. Это определяет, будет ли конечный результат отрицательным или положительным соответственно. Предположим, что результат положительный, если ни того, ни другого нет.

Считывайте далее символы до тех пор, пока не будет достигнут следующий нецифровый символ или конец ввода. Остальная часть строки игнорируется.

Преобразуйте эти цифры в целое число (т.е. “123” -> 123, “0032” -> 32). Если не было прочитано ни одной цифры, то целое число равно 0. Измените знак по мере необходимости (начиная с шага 2).

Если целое число находится за пределами 32-разрядного диапазона целых чисел со знаком [-2^31, 2^31 - 1], то зафиксируйте целое число так, чтобы оно оставалось в диапазоне. В частности, целые числа меньше -2^31 должны быть привязаны к -2^31, а целые числа больше 2^31 - 1 должны быть привязаны к 2^31 - 1.

Возвращает целое число в качестве конечного результата.

Примечание:

  • Только символ пробела ‘ ‘ считается пробельным символом.

  • Не игнорируйте никакие символы, кроме начального пробела или остальной части строки после цифр.

Пример 1.

Входные данные: s = “42”

Результат: 42

Пояснение:

Подчеркнутые символы – это то, что считывается, курсив – это текущая позиция считывателя.

Шаг 1: “42” (символы не читаются, потому что нет начального пробела)

Шаг 2: “42” (символы не читаются, потому что нет ни ‘-‘, ни ‘+’)

Шаг 3: “42” (“42” читается в)

Проанализированное целое число равно 42. Поскольку 42 находится в диапазоне [-2^31, 2^31 - 1], конечный результат равен 42.

Пример 2.

Входные данные: s = “ -42”

Результат: -42

Пояснение:

Шаг 1: “ -42” (начальный пробел считывается и игнорируется)

Шаг 2: “-42” (считывается ‘-‘, поэтому результат должен быть отрицательным)

Шаг 3: “-42” (“42” считывается в)

Проанализированное целое число равно -42. Поскольку -42 находится в диапазоне [-2^31, 2^31 - 1], конечный результат равен -42.

Пример 3.

Входные данные: s = “4193 with words”

Результат: 4193

Пояснение:

Шаг 1: “4193 with words” (символы не читаются, потому что нет начального пробела)

Шаг 2: “4193 with words” (символы не читаются, потому что нет ни ‘-‘, ни ‘+’)

Шаг 3: “4193 with words” (считывается “4193”; чтение прекращается, поскольку следующий символ не является цифрой)

Проанализированное целое число равно 4193. Поскольку 4193 находится в диапазоне [-2^31, 2^31 - 1], конечный результат равен 4193.

Решение.

class Solution {
public:
    int myAtoi(string s) {
        int sign = 1, i = 0, value;

        // убираем пробелы
        while(s[i] == ' ') i++;

        // определяем знак
        if(s[i] == '+'|| s[i] == '-'){
            if(s[i] == '-') sign = -1;
            i++;
        }

        // результат
        double result = 0;
        while (i < s.length()) {

            // цифра
            value = s[i] - '0';

            // выходим, если не цифра
            if (value < 0 || value > 9) break;

            // вычисление
            result *= 10;
            result += value;
            i++;
        }

        // знак
        result *= sign;

        // диапазон для int
        if(result > INT_MAX) {
            result = INT_MAX;
        } else if (result < INT_MIN) {
            result = INT_MIN;
        }

        return (int)result;
    }
};