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-231should be clamped to-231, and integers greater than231 - 1should 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
- sconsists 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;
}
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;
	}
};
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;
  }
}
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);
};
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;  
};
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
Input
Output
