LeetCode #8 Medium
题目描述
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。
函数 myAtoi(string s) 的算法如下:
- 读入字符串并丢弃无用的前导空格
- 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。如果两者都不存在,则假定结果为正。
- 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
- 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0。必要时更改符号(从步骤 2 开始)。
- 如果整数数超过 32 位有符号整数范围
[−2^31, 2^31 − 1],需要截断这个整数,使其保持在这个范围内。具体来说,小于−2^31的整数应该被固定为−2^31,大于2^31 − 1的整数应该被固定为2^31 − 1。 - 返回整数作为最终结果。
示例
输入:s = "42"
输出:42
输入:s = " -42"
输出:-42
输入:s = "4193 with words"
输出:4193
我的解题过程
根据条件一步一步处理
function myAtoi(s: string): number {
const signs = ["-", "+"];
let isAdd = true;
let numberString = "";
let index = 0;
const INT_MAX = 2 ** 31 - 1;
const INT_MIN = -(2 ** 31);
// 跳过空格
while (s[index] === " ") {
index++;
}
// 符号检查
if (signs.includes(s[index])) {
isAdd = s[index] === "+";
index++;
}
while (index < s.length && s[index] >= "0" && s[index] <= "9") {
numberString += s[index];
index++;
}
// 没有读到数字
if (numberString === "") return 0;
const num = isAdd ? Number(numberString) : -Number(numberString);
if (num > INT_MAX) return INT_MAX;
if (num < INT_MIN) return INT_MIN;
return num;
}