原题地址:https://leetcode-cn.com/problems/string-to-integer-atoi/

一、题目描述

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−21474837648, 21474837647]。如果数值超过这个范围,需要返回 −2147483764821474837647 中的一个值

二、示例

示例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 (−2147483648) 。

三、javascript 构造输入

除了上面的几个输入外,建议还构造几个特殊的输入:

let str = '';

str = '  4 2 ';
str = '   -42'
str = '4193 with words'
str = 'words and 987'
str = '-91283472332'
str = '-+1';
str = '-0 1';
str = '-abc';

四、javascript 解题

为什么要构造上面这种 -+1-abc 这样的输入输出,这是因为一开始想的比较简单,只判断了以 - 或者 + 或者 \d+ 开头的就可以了。

因此我的判断代码是这么写的:

str = str.replace(/^\s+|\s+$/g, '');
let regx = /^(\-|\+|\d+)/g;
if (!str || !regx.test(str)) return 0;

这样导致的问题就是在 -+1 这种情况直接就凉了。

所以我最终并没有用正则判断开头,而是先判断第一个字符,在判断第二个字符,这样才能保证没问题。

另一个需要注意的是,这个数字很可能以 + 开头,而最终这个 + 是没必要的

最终代码如下:

/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function (str) {
    return getResultNew(str);
};

function getResultNew(str) {
    let res = '';
    let lt0 = false; // 判断是否小于0 最终和32位最大最小数比较有用
    str = str.replace(/^\s+|\s+$/g, ''); // 把开头和结尾的空格去掉
    if(str[0] === '-') { // 如果是以 - 开头
        lt0 = true; // 表明最终是负数
        str = str.substring(1, str.length); // 去掉开头字符
    } else if (str[0] === '+') { 
        str = str.substring(1, str.length); // 去掉开头字符
    }
    let len = str.length;
    for (let i = 0; i < len; i++) {
        regx = /\d+/;
        if (!regx.test(str[i])) { // 如果发现不是数字的,直接结束循环
            break;
        }
        res += str[i];
    }
    if(!res) return 0; // 在 - 或者 `-a`这种情况下, res 此时就是空字符,因此返回 0
    res = lt0 ? `-${res}` : res; // 负数需要加上 -
    if(res < -2147483648) return -2147483648;  // 比较大小
    if(res > 2147483647) return 2147483647;
    return res;
}

五、结果

1.jpg