Реализуйте
myAtoi(string s)
функцию, которая преобразует строку в 32-битное целое число со знаком (аналогично функции C/C++atoi
).Алгоритм работы
myAtoi(string s)
следующий:
- Прочтите и игнорируйте начальные пробелы.
- Проверьте, является ли следующий символ (если он еще не находится в конце строки)
'-'
или'+'
. Прочтите этот символ, если он есть. Это определяет, будет ли окончательный результат отрицательным или положительным соответственно. Предположим, что результат положительный, если ни один из них не присутствует.- Считайте следующие символы, пока не будет достигнут следующий нецифровой символ или конец ввода. Остальная часть строки игнорируется.
- Преобразуйте эти цифры в целое число (т.е.
"123" -> 123
,"0032" -> 32
). Если цифры не были прочитаны, то целое число равно0
. При необходимости измените знак (из шага 2).- Если целое число выходит за пределы диапазона 32-разрядных целых чисел со знаком , зафиксируйте целое число, чтобы оно оставалось в этом диапазоне. В частности, целые числа меньше должны быть зафиксированы до , а целые числа больше должны быть зафиксированы до .
[-231, 231 - 1]
-231
-231
231 - 1
231 - 1
- Возвращает целое число в качестве окончательного результата.
Примечание:
Пример 1:
- Только символ пробела
' '
считается символом пробела.- Не игнорируйте никакие символы, кроме начального пробела или остальной части строки после цифр.
Ввод: s = «42»
Вывод: 42
Объяснение: Подчеркнутые символы — это то, что читается, знак вставки — это текущая позиция считывателя.
Шаг 1: «42» (символы не читаются, потому что нет начального пробела)
Шаг 2: «42» (символы не читаются, потому что нет ни «-», ни «+»)
Шаг 3: «
42 » («42» считывается)
Проанализированное целое число равно 42.
Поскольку 42 находится в диапазоне [-2
31 , 2
31 — 1], окончательный результат равен 42.
Решение данной задачи может быть реализовано следующим образом:
- Прочитаем и проигнорируем начальные пробелы, если они есть, пока не достигнем первого непробельного символа.
- Проверим, является ли следующий символ ‘-‘ или ‘+’. Если да, запомним знак и перейдем к следующему символу.
- Считывайте символы, пока они являются цифрами (от ‘0’ до ‘9’), преобразуя их в числовое значение и добавляя их к результату.
- При необходимости измените знак результата в соответствии с сохраненным знаком.
- Проверьте, выходит ли результат за пределы диапазона 32-битных целых чисел со знаком [-2^31, 2^31 — 1]. Если да, верните предельное значение (MIN_INT или MAX_INT) в зависимости от знака.
- Верните полученное целое число в качестве окончательного результата.
Решение задачи «String to Integer (atoi)» пример кода на Python
class Solution(object): def myAtoi(self, s): s = s.strip() # Удаляем начальные и конечные пробелы if not s: return 0 sign = 1 # Знак числа (1 для положительного, -1 для отрицательного) result = 0 i = 0 if s[i] == '-' or s[i] == '+': # Проверяем знак числа if s[i] == '-': sign = -1 i += 1 while i < len(s) and s[i].isdigit(): # Считываем цифры result = result * 10 + int(s[i]) i += 1 result *= sign # Применяем знак к результату # Проверка на выход из диапазона 32-битных целых чисел if result < -2**31: return -2**31 elif result > 2**31 - 1: return 2**31 - 1 else: return result
Решение задачи «String to Integer (atoi)» пример кода на Java
class Solution { public int myAtoi(String s) { s = s.trim(); // Удаляем начальные и конечные пробелы if (s.isEmpty()) return 0; int sign = 1; // Знак числа (1 для положительного, -1 для отрицательного) int result = 0; int i = 0; if (s.charAt(i) == '-' || s.charAt(i) == '+') { // Проверяем знак числа if (s.charAt(i) == '-') sign = -1; i++; } while (i < s.length() && Character.isDigit(s.charAt(i))) { // Считываем цифры int digit = s.charAt(i) - '0'; if (result > (Integer.MAX_VALUE - digit) / 10) { return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE; } result = result * 10 + digit; i++; } return result * sign; // Применяем знак к результату } }
Решение задачи «String to Integer (atoi)» пример кода на C++
class Solution { public: int myAtoi(string s) { s.erase(0, s.find_first_not_of(' ')); // Удаляем начальные пробелы if (s.empty()) return 0; int sign = 1; // Знак числа (1 для положительного, -1 для отрицательного) int result = 0; int i = 0; if (s[i] == '-' || s[i] == '+') { // Проверяем знак числа if (s[i] == '-') sign = -1; i++; } while (i < s.length() && isdigit(s[i])) { // Считываем цифры int digit = s[i] - '0'; if (result > (INT_MAX - digit) / 10) { return (sign == 1) ? INT_MAX : INT_MIN; } result = result * 10 + digit; i++; } return result * sign; // Применяем знак к результату } };
Решение задачи «String to Integer (atoi)» пример кода на JavaScript
/** * @param {string} s * @return {number} */ var myAtoi = function(s) { s = s.trim(); // Удаляем начальные и конечные пробелы if (s.length === 0) return 0; let sign = 1; // Знак числа (1 для положительного, -1 для отрицательного) let result = 0; let i = 0; if (s[i] === '-' || s[i] === '+') { // Проверяем знак числа if (s[i] === '-') sign = -1; i++; } while (i < s.length && /^\d$/.test(s[i])) { // Считываем цифры result = result * 10 + parseInt(s[i]); i++; } result *= sign; // Применяем знак к результату // Проверка на выход из диапазона 32-битных целых чисел if (result < -Math.pow(2, 31)) { return -Math.pow(2, 31); } else if (result > Math.pow(2, 31) - 1) { return Math.pow(2, 31) - 1; } else { return result; } }
Решение задачи «String to Integer (atoi)» пример кода на C#
public class Solution { public int MyAtoi(string s) { s = s.Trim(); // Удаляем начальные и конечные пробелы if (string.IsNullOrEmpty(s)) return 0; int sign = 1; // Знак числа (1 для положительного, -1 для отрицательного) int result = 0; int i = 0; if (s[i] == '-' || s[i] == '+') { // Проверяем знак числа if (s[i] == '-') sign = -1; i++; } while (i < s.Length && char.IsDigit(s[i])) { // Считываем цифры int digit = s[i] - '0'; if (result > (int.MaxValue - digit) / 10) { return (sign == 1) ? int.MaxValue : int.MinValue; } result = result * 10 + digit; i++; } return result * sign; // Применяем знак к результату } }
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы