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)
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
思路分析
以下是需要做的事情
过滤空字符串开头 parseInt 内置
处理正负符号情况 parseInt 内置
过滤字符串尾部非法字符 parseInt 内置
非正负号、空格数字开头,返回 0 手动实现
处理过滤后的数字不可大于 2^31 和小于 2^31-1手动实现
由于前面 3
点,parseInt
函数都已经内置了,那我们只需要针对第 4、5
点做相应的处理即可。