Appearance
字符串转换整数(atoi)
中等
请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi
函数)。
函数 myAtoi(string s)
的算法如下:
- 读入字符串并丢弃无用的前导空格
- 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
- 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
- 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为
0
。必要时更改符号(从步骤 2 开始)。 - 如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
- 返回整数作为最终结果。
注意:
- 本题中的空白字符只包括空格字符
' '
。 - 除前导空格或数字后的其余字符串外,*请勿忽略** 任何其他字符。
提示:
0 <= s.length <= 200
s 由英文字母(大写和小写)、数字(
0-9)、
' '、
'+'、
'-'和
'.'` 组成
题解
这道题简单的方式是直接使用 parseInt 来做,需要进行细节处理:如果 parseInt 结果为 NaN,则返回 0,如果超过 32 位有符号整数范围,则进行固定
typescript
var myAtoi = function (s) {
s = parseInt(s);
if (isNaN(s)) return 0;
let min = Math.pow(-2, 31);
let max = Math.pow(2, 31) - 1;
if (s < min) return min;
if (s > max) return max;
return s;
};
如果不借助 parseInt,也可以自己对字符串进行处理转换,步骤如下
- 去除原字符串的头尾空格
- 判断有无正负符号
- 循环拼接数字,当不是数字则终止循环(注意对空格的处理,在 js 中空格会被转换为 0)
- 对结果进行转换,判断是否超出范围
typescript
var myAtoi = function (s) {
// 去除字符串首尾的空格
s = s.trim();
// 新建变量接收转换结果
let res = "";
// 判断正负符号
if (s[0] === "+" || s[0] === "-") {
res = s[0];
// 去除正负符号
s = s.slice(1);
}
// 循环
for (let i = 0; i < s.length; i++) {
if (s[i] >= 0 && s[i] <= 9 && s[i] !== " ") {
// 如果为数字则拼接
res += s[i];
} else {
// 如果不是数字则结束循环
break;
}
}
// 处理结果只有一个符号的情况:例如 "+dssdds" => "+"
if (res === "+" || res === "-") res = "";
let min = Math.pow(-2, 31);
let max = Math.pow(2, 31) - 1;
r = Number(r);
if (r < min) r = min;
if (r > max) r = max;
return r;
};