Skip to content

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

原文题目

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

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

空格:读入字符串并丢弃无用的前导空格(" ")

符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。

转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为 0。

舍入:如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被舍入为 −2^31 ,大于 2^31 − 1 的整数应该被舍入为 2^31 − 1 。

返回整数作为最终结果。

https://leetcode.cn/problems/string-to-integer-atoi/description/

题目分析

题目中的意思就是给你一个字符串 s、返回合法的数字部分。

字符串可能由英文字母[A-z]、数字 [0-9]、空格、正负号 + - 或小数点 . 组成。

如果处理后的数字小于 2^31,则返回 2^31

如果处理的数字大于 2^31-1,则返回 2^31-1

示例

输入 s = '42' 输出 42

输入 s = '-042' 输出 -42

输入 s = '1337c0d3' 输出 1337

输入 s = '0-1' 输出 0

输入 s = 'words and 987' 输出 0

输入 s = '-91283472332' 输出 -2147483648

题解思路

方式一:通过 parseInt 实现

在此之前,我还用了其他的方式去实现,但是太笨了。遍历字符串,挨个去判断做处理。后来才发现 parseInt 都内置了这些功能了。

时间复杂度:O(1)

空间复杂度:O(1)

js
const myAtoi = function (s) {
    const n = parseInt(s)

    /**
     * 非正负号、空格数字开头,返回 0
     */
    if (isNaN(n)) {
        return 0
    }

    /**
     * 处理过滤后的数字不可大于 2^31 和小于 2^31-1
     */
    if ((n | 0) !== n) {
        const min = Math.pow(-2, 31)
        const max = Math.pow(2, 31) - 1
        return n < min ? min : max
    }

    return n
}

myAtoi('1337c0d3') // 1337
思路分析

以下是需要做的事情

  1. 过滤空字符串开头 parseInt 内置

  2. 处理正负符号情况 parseInt 内置

  3. 过滤字符串尾部非法字符 parseInt 内置

  4. 非正负号、空格数字开头,返回 0 手动实现

  5. 处理过滤后的数字不可大于 2^31 和小于 2^31-1手动实现

由于前面 3 点,parseInt 函数都已经内置了,那我们只需要针对第 4、5 点做相应的处理即可。

更新时间: