一、题目描述
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数
算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
实例:
输入:s = " -42"
输出:-42
解释:
第 1 步:" -42"(读入前导空格,但忽视掉)
^
第 2 步:" -42"(读入 '-' 字符,所以结果应该是负数)
^
第 3 步:" -42"(读入 "42")
^
解析得到整数 -42 。
由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。
二、思路
简单来说就是要匹配字符串中的数字(有的带符号),根据上述的实例,我们可以先将前导空格去除,这里可以用trim()方法实现,然后用match()方法,建立合适的正则匹配规则,匹配出答案,最后判断该整数是否越界,根据规则进行输出返回即可
该题正则匹配规则:
1. 在上述实例中整数以(+或-)开头,如果是+号,可能会不出现,所以符号部分的正则匹配是/^[ - | + ]{ 0, 1 }/
2. 该整数数字部分,可以是多位数字,所以它的正则匹配是/ [ 0-9 ]+ /
综上所述,两者合在一起便是/ ^[ -|+ ]{ 0, 1 }[ 0-9 ]+/
三、代码展示
var myAtoi = function(str) {
//利用正则匹配
let s = str.trim().match(/^[-|+]{0,1}[0-9]+/)
// 范围判断
if(s !== null) {
if(s[0] > Math.pow(2, 31)-1) {
return Math.pow(2, 31) - 1
} else if (s[0] < Math.pow(-2, 31)) {
return Math.pow(-2, 31)
}
return s[0]
}
return 0;
};
四、知识回顾
1、关于正则表达式的概念
表达式 | 描述 |
[0-9] | 查找任何从 0 至 9 的数字。 |
(1|2|3|4) | 查找任何指定的选项。 |
量词 | 描述 |
n+ | 匹配任何包含至少一个 n 的字符串。 |
2、关于js String对象的match方法
方法 | 描述 |
match() | 查找找到一个或多个正则表达式的匹配 |
match()方法返回的值是一个数组,也就是说,他会自动匹配左右符合条件的元素,组成一个数组