Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

字符串转整数 (atoi) #44

Open
louzhedong opened this issue Sep 1, 2018 · 0 comments
Open

字符串转整数 (atoi) #44

louzhedong opened this issue Sep 1, 2018 · 0 comments

Comments

@louzhedong
Copy link
Owner

习题

出处:LeetCode 算法第8题

实现 atoi,将字符串转为整数。

在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。

当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。

若函数不能执行有效的转换,返回 0。

说明:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。

示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。

思路

首先通过正则去除收尾部的空白字符,并提取从头开始的数字。判断数字正负以及长度,考虑所有情况

解答

/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function (str) {
  var INT_MAX = Math.pow(2, 31) - 1;
  var INT_MIN = Math.pow(-2, 31);
  var string = str.replace(/^(\s+)|(\s+)$/g, '');
  var match = /^(?:\-|\+)?(\d+)/.exec(string);
  if (match) {
    var sign = (string.charAt(0) == '-') ? -1 : 1;
    var digits = match[1];
    var carry = Math.floor(INT_MAX / 10);
    var remainder = INT_MAX - carry * 10 - (sign == 1 ? 1 : 0);
    var result = 0;
    for (var i = 0; i < digits.length; ++i) {
      var currentNum = parseInt(digits.charAt(i));
      if ((result == carry && currentNum > remainder) || result > carry) {
        return sign == 1 ? INT_MAX : INT_MIN;
      } else {
        result = (result * 10) + currentNum;
      }
    }
    return sign * result;
  } else {
    return 0;
  }
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant