请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

函数 myAtoi(string s) 的算法如下:

1、空格:读入字符串并丢弃无用的前导空格(" ")
2、符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
3、转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
4、舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。

返回整数作为最终结果。

示例 1:

输入:s = “42”

输出:42

解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。

带下划线线的字符是所读的内容,插入符号是当前读入位置。

第 1 步:“42”(当前没有读入字符,因为没有前导空格)

第 2 步:“42”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)

第 3 步:“42”(读入 “42”)

示例 2:

输入:s = " -042"

输出:-42

解释:

第 1 步:" -042"(读入前导空格,但忽视掉)

第 2 步:" -042"(读入 ‘-’ 字符,所以结果应该是负数)

第 3 步:" -042"(读入 “042”,在结果中忽略前导零)

示例 3:

输入:s = “1337c0d3”

输出:1337

解释:

第 1 步:“1337c0d3”(当前没有读入字符,因为没有前导空格)

第 2 步:“1337c0d3”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)

第 3 步:“1337c0d3”(读入 “1337”;由于下一个字符不是一个数字,所以读入停止)

示例 4:

输入:s = “0-1”

输出:0

解释:

第 1 步:“0-1” (当前没有读入字符,因为没有前导空格)

第 2 步:“0-1” (当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)

第 3 步:“0-1” (读入 “0”;由于下一个字符不是一个数字,所以读入停止)

示例 5:

输入:s = “words and 987”

输出:0

解释:

读取在第一个非数字字符“w”处停止。

题意分析

官方的主要规则可以概况为:

  • 无视开头空格
  • 返回有符号整数
  • 无视整数部分后的字符
  • 范围在32位内(含)
  • 其他情况返回0

这个转换规则和parseInt()这一API的转换规则相似。

现在来简要阐述下parseInt()的转换规则,关于这个API的具体描述,可以查看MDN上的这篇文档。

parseInt(string, radix)

string:要被解析的值。如果参数不是一个字符串,则将其转换为字符串。字符串开头的空白符将会被忽略。
radix(可选):需要转换的进制,介于 2 到 36。
返回值: 如果被解析参数的第一个字符无法被转化成数值类型,则返回NaN

对比下题意,发现

  • 无视开头空格(满足)
  • 返回有符号整数(满足)
  • 无视整数部分后的字符(满足)
  • 范围在32位内(含)(不满足)
  • 其他情况返回0(不满足)

那么只要有针对性的处理下不满足的条件即可。

/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function(str) {
    const number = parseInt(str, 10);

    if(isNaN(number)) {
        return 0;
    } else if (number < Math.pow(-2, 31) || number > Math.pow(2, 31) - 1) {
        return number < Math.pow(-2, 31) ? Math.pow(-2, 31) : Math.pow(2, 31) - 1;
    } else {
        return number;
    }
};

示例分析

输入:“42”
parseInt("42", 10) 返回 42。
42 在 32 位整数范围内,因此直接返回 42。

输入:“-42”
parseInt("-42", 10) 返回 -42。
-42 在 32 位整数范围内,因此直接返回 -42。

输入:“2147483648”
parseInt("2147483648", 10) 返回 2147483648。
这个值超出了 32 位整数的范围,因此返回 2147483647。

输入:“-2147483649”
parseInt("-2147483649", 10) 返回 -2147483649。
这个值超出了 32 位整数的范围,因此返回 -2147483648。

输入:“hello”
parseInt("hello", 10) 返回 NaN。
isNaN(number) 为 true,因此返回 0。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部