String to Integer (atoi)

medium string

Problem

Implement atoi which converts a string into a 32-bit signed integer. Skip leading whitespace, accept an optional '+' or '-' sign, then read consecutive digits and stop at the first non-digit. Clamp the result to [-2^31, 2^31 - 1].

Input" -42 with words"
Output-42
Whitespace is skipped, sign is '-', digits "42" are read, parsing stops at the space.

def my_atoi(s):
    INT_MAX = 2**31 - 1
    INT_MIN = -2**31
    i, n = 0, len(s)
    while i < n and s[i] == ' ':
        i += 1
    sign = 1
    if i < n and s[i] in '+-':
        sign = -1 if s[i] == '-' else 1
        i += 1
    val = 0
    while i < n and s[i].isdigit():
        val = val * 10 + int(s[i])
        i += 1
    val *= sign
    return max(INT_MIN, min(INT_MAX, val))
function myAtoi(s) {
  const MAX = 2**31 - 1, MIN = -(2**31);
  let i = 0, n = s.length;
  while (i < n && s[i] === ' ') i++;
  let sign = 1;
  if (i < n && (s[i] === '+' || s[i] === '-')) {
    sign = s[i] === '-' ? -1 : 1;
    i++;
  }
  let val = 0;
  while (i < n && s[i] >= '0' && s[i] <= '9') {
    val = val * 10 + (s.charCodeAt(i) - 48);
    i++;
  }
  val *= sign;
  return Math.max(MIN, Math.min(MAX, val));
}
class Solution {
    public int myAtoi(String s) {
        int i = 0, n = s.length();
        while (i < n && s.charAt(i) == ' ') i++;
        int sign = 1;
        if (i < n && (s.charAt(i) == '+' || s.charAt(i) == '-')) {
            sign = s.charAt(i) == '-' ? -1 : 1;
            i++;
        }
        long val = 0;
        while (i < n && Character.isDigit(s.charAt(i))) {
            val = val * 10 + (s.charAt(i) - '0');
            if (sign * val > Integer.MAX_VALUE) return Integer.MAX_VALUE;
            if (sign * val < Integer.MIN_VALUE) return Integer.MIN_VALUE;
            i++;
        }
        return (int)(sign * val);
    }
}
int myAtoi(string s) {
    int i = 0, n = s.size();
    while (i < n && s[i] == ' ') i++;
    int sign = 1;
    if (i < n && (s[i] == '+' || s[i] == '-')) {
        sign = s[i] == '-' ? -1 : 1;
        i++;
    }
    long long val = 0;
    while (i < n && isdigit(s[i])) {
        val = val * 10 + (s[i] - '0');
        if (sign * val > INT_MAX) return INT_MAX;
        if (sign * val < INT_MIN) return INT_MIN;
        i++;
    }
    return (int)(sign * val);
}
Time: O(n) Space: O(1)