Algorithm
Problem Name: 8. String to Integer (atoi)
Problem Link: https://leetcode.com/problems/string-to-integer-atoi/
Implement the myAtoi(string s)
function, which converts a string to a 32-bit signed integer (similar to C/C++'s atoi
function).
The algorithm for myAtoi(string s)
is as follows:
- Read in and ignore any leading whitespace.
- Check if the next character (if not already at the end of the string) is
'-'
or'+'
. Read this character in if it is either. This determines if the final result is negative or positive respectively. Assume the result is positive if neither is present. - Read in next the characters until the next non-digit character or the end of the input is reached. The rest of the string is ignored.
- Convert these digits into an integer (i.e.
"123" -> 123
,"0032" -> 32
). If no digits were read, then the integer is0
. Change the sign as necessary (from step 2). - If the integer is out of the 32-bit signed integer range
[-231, 231 - 1]
, then clamp the integer so that it remains in the range. Specifically, integers less than-231
should be clamped to-231
, and integers greater than231 - 1
should be clamped to231 - 1
. - Return the integer as the final result.
Note:
- Only the space character
' '
is considered a whitespace character. - Do not ignore any characters other than the leading whitespace or the rest of the string after the digits.
Example 1:
Input: s = "42" Output: 42 Explanation: The underlined characters are what is read in, the caret is the current reader position. Step 1: "42" (no characters read because there is no leading whitespace) ^ Step 2: "42" (no characters read because there is neither a '-' nor '+') ^ Step 3: "42" ("42" is read in) ^ The parsed integer is 42. Since 42 is in the range [-231, 231 - 1], the final result is 42.
Example 2:
Input: s = " -42" Output: -42 Explanation: Step 1: " -42" (leading whitespace is read and ignored) ^ Step 2: " -42" ('-' is read, so the result should be negative) ^ Step 3: " -42" ("42" is read in) ^ The parsed integer is -42. Since -42 is in the range [-231, 231 - 1], the final result is -42.
Example 3:
Input: s = "4193 with words" Output: 4193 Explanation: Step 1: "4193 with words" (no characters read because there is no leading whitespace) ^ Step 2: "4193 with words" (no characters read because there is neither a '-' nor '+') ^ Step 3: "4193 with words" ("4193" is read in; reading stops because the next character is a non-digit) ^ The parsed integer is 4193. Since 4193 is in the range [-231, 231 - 1], the final result is 4193.
Constraints:
0 <= s.length <= 200
s
consists of English letters (lower-case and upper-case), digits (0-9
),' '
,'+'
,'-'
, and'.'
.
Code Examples
#1 Code Example with C Programming
Code -
C Programming
int myAtoi(char* str) {
int d, k = 0, negative = 0;
if (!str) return 0;
while (*str == ' ') str ++;
if (*str == '+') {
str ++;
negative = 1;
str ++;
}
while (*str >= '0' && *str < = '9') {
d = *str - '0';
str ++;
if (negative == 0) {
if (k > (0x7fffffff - d) / 10) { // possitive number overflow
return 0x7fffffff;
}
k = k * 10 + d;
} else {
if (k < ((signed)0x80000000 + d) / 10) { // negative number overflow
return 0x80000000;
}
k = k * 10 - d;
}
}
return k;
}
Copy The Code &
Try With Live Editor
Input
Output
#2 Code Example with C++ Programming
Code -
C++ Programming
class Solution {
public:
int myAtoi(string str) {
if (str.size() == 0) return 0;
int cur = 0;
while (cur < str.size() && str[cur] == ' ') cur++;
if (cur == str.size() || (!isdigit(str[cur]) && str[cur] != '+' && str[cur] != '-')) return 0;
int end = cur + 1;
while (isdigit(str[end])) end++;
string s = str.substr(cur, end - cur);
int num = 0;
int base = 1;
for (int i = s.size() - 1; i >= 0; i--) {
if (s[i] == '+' || s[i] == '-') break;
int add = base * (s[i] - '0');
if (INT_MAX - num < add || (s.size() - i > 10 && s[i] != '0'))
return s[0] == '-' ? INT_MIN : INT_MAX;
num += add;
base *= 10;
}
if (s[0] == '-') num = -num;
return num;
}
};
Copy The Code &
Try With Live Editor
Input
Output
#3 Code Example with Java Programming
Code -
Java Programming
class Solution {
public int myAtoi(String s) {
int idx = 0;
int n = s.length();
while (idx < n && s.charAt(idx) == ' ') {
idx++;
}
int sign = 1;
if (idx < n && (s.charAt(idx) == '-' || s.charAt(idx) == '+')) {
sign = s.charAt(idx) == '-' ? -1 : 1;
idx++;
}
if (idx == n || !Character.isDigit(s.charAt(idx))) {
return 0;
}
while (idx < n && s.charAt(idx) == '0') {
idx++;
}
int number = 0;
while (idx < n && Character.isDigit(s.charAt(idx))) {
int digit = Character.getNumericValue(s.charAt(idx));
if ((number > Integer.MAX_VALUE / 10) || (number == Integer.MAX_VALUE / 10 && digit > Integer.MAX_VALUE % 10)) {
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
number = number * 10 + digit;
idx++;
}
return number * sign;
}
}
Copy The Code &
Try With Live Editor
Input
Output
#4 Code Example with Javascript Programming
Code -
Javascript Programming
const myAtoi = function(str) {
return Math.max(Math.min(parseInt(str) || 0, 2147483647), -2147483648);
};
Copy The Code &
Try With Live Editor
Input
Output
#5 #4 Code Example with Another Javascript Programming
Code -
Javascript Programming
const myAtoi = function(s) {
let n = s.length, i = 0, j = 0, sign = 1;
if(n === 0) {
return 0;
}
while(i < n && s[i] === ' ') {
i++;
}
if(i < n && (s[i] === '-' || s[i] === '+')) {
sign = (s[i] === '-') ? -1 : 1;
i++;
}
j = i
while(i < n) {
if(Number.isInteger(parseInt(s[i]))) i++;
else break;
}
let result = parseInt(s.slice(j, i))
if(isNaN(result)) return 0
if(sign * result < -(2**31)) return -(2**31>;
else if(sign * result > (2**31-1)) return 2**31-1;
else return sign * result;
};
Copy The Code &
Try With Live Editor
Input
Output
#6 Code Example with Python Programming
Code -
Python Programming
class Solution:
def myAtoi(self, str):
r = [int(c) for c in re.findall(r"^[-+]?\u005Cd+", str.lstrip())]
return (r and 2 ** 31 - 1 < r[0] and 2 ** 31 - 1) or (r and r[0] < -2 ** 31 and -2 ** 31) or (r and r[0]) or 0
Copy The Code &
Try With Live Editor
Input
Output