这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
前言
关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!
题目描述
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
示例 1:
输入:s = "42"
输出:42
示例 2:
输入:s = " -42"
输出:-42
示例 3:
输入:s = "4193 with words"
输出:4193
示例 4:
输入:s = "words and 987"
输出:0
示例 5:
输入:s = "-91283472332"
输出:-2147483648
解释:解析得到整数 -91283472332。由于 -91283472332 小于范围 [-2^31, 2^31 - 1] 的下界,最终结果被截断为 -2^31 = -2147483648 。
链接:leetcode-cn.com/problems/st…
题解
这道题就是将字符串转换为数字。要对字符串做下面的处理:
- 字符串开头可能会有多个空白字符 ' ',所以要判断开头的字符,去除空白字符
- 除去空白字符外,字符串可能以 '+', '-' 开始,所以要判断这两个字符是否存在
- 字符串中不一定全是数字,要取出前面的数字部分,如果是以非数字开头则返回 0
- 最后返回的数字必须在 [-2^31, 2^31 - 1] 范围内,否则返回对应的上下边界。
搞清楚以上几个条件之后,我们只需要用一个下标变量 i,来依次判断每个字符,用 flag 来记录正负。具体代码如下,时间复杂度 O(n)。
/**
* @param {string} s
* @return {number}
*/
var myAtoi = function(s) {
let ans = ''
let i = 0
let n = s.length
let flag = 1
// 删除前面的空白字符
while ( i < n && s[i] === ' ') {
i++
}
//判断符号
if (s[i] === '-') {
flag = -1
i++
} else if (s[i] === '+') {
i++
}
// 判断数字
while ( i < n && isNumber(s[i])) {
ans = ans * 10 + Number(s[i])
i++
}
// 不是数字
if (ans === '') {
return 0
}
ans = ans * flag
// 判断范围
const min = - Math.pow(2, 31)
const max = Math.pow(2, 31) - 1
if (ans < min) {
return min
}
if (ans > max) {
return max
}
return ans
};
var isNumber = (x) => {
return x >= '0' && x <= '9'
}