silver-hands / sss

0 stars 0 forks source link

【Q104】8. 字符串转换整数 (atoi) #104

Open fly0o0 opened 4 years ago

fly0o0 commented 4 years ago

8. 字符串转换整数 (atoi)

fly0o0 commented 4 years ago
/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function(str) {
  let i = 0
  let negative = false

  let MAX_INT = Math.pow(2, 31) - 1
  let MIN_INT = -Math.pow(2, 31)

  while (str[i] == ' ') {
    i++
  }

  if (str[i] == '-') {
    negative = true
    i++
  } else if (str[i] == '+') {
    i++
  } else if (str[i] < '0' || str[i] > '9') {
    return 0
  }

  let ans = 0

  while (i < str.length && (str[i] >= '0' && str[i] <= '9')) {
    let tmp = str[i] - '0'

    if (ans > MAX_INT) {
      return MAX_INT
    }

    if (ans < MIN_INT) {
      return MIN_INT
    }

    if (ans > (MAX_INT - tmp) / 10) {
      // 本来应该是 ans * 10 + tmp > MAX_INT
      // 但是 *10 和 + tmp 都有可能越界,所有都移动到右边去就可以了。
      return negative ? MIN_INT : MAX_INT;
    }

    ans = ans * 10 + tmp
    i++
  }

  return negative ? -ans : ans
};