/*
 * [8] 字符串转换整数 (atoi)
 */

/**
 * @param {string} s
 * @return {number}
 */
const INT_MAX = (((1 << 30) - 1) << 1) + 1;
const INT_MIN = -1 << 31;
const MAX = Math.floor(INT_MAX / 10);

var myAtoi = function (s) {
  let length = s.length;
  let index = 0;
  while (index < length && s[index] === ' ') {
    index++;
  }
  if (index === length) {
    return 0;
  }
  let sign = 1;
  if (s[index] === '+') {
    index++;
  } else if (s[index] === '-') {
    sign = -1;
    index++;
  }
  let num = 0;
  while (index < length && /[0-9]/.test(s[index])) {
    let digit = Number(s[index]);
    if (num > MAX || num < -MAX) {
      return sign > 0 ? INT_MAX : INT_MIN;
    } else if (num === MAX || num === -MAX) {
      if (sign > 0 && digit > 7) {
        return INT_MAX;
      } else if (sign < 0 && digit > 8) {
        return INT_MIN;
      }
    }
    num = num * 10 + digit * sign;
    index++;
  }
  return num;
};