思路
分情况处理,写了一堆if-else
var myAtoi = function (s) {
// 空字符串返回0
if (s.length === 0) return 0;
let cur = 0; // 记录当前字符串下标
// 丢弃前导空格,并判断删除前导空格后是否为空字符串
while (s[cur] === " ") cur++;
if (cur >= s.length) return 0;
// 决定结果是正还是负
let multi = 1;
if (s[cur] === "-") {
multi = -1;
cur++;
} else if (s[cur] === "+") {
multi = 1;
cur++;
} else if (s.charCodeAt(cur) < 48 || s.charCodeAt(cur) > 57) {
return 0;
}
const res = []; // 保存已经读入的字符
for (; cur < s.length; cur++) {
let num = s.charCodeAt(cur) - 48;
if (num < 0 || num > 9) break;
res.push(num);
// 👇这行代码理解错了,以为超过整数范围以后就不读入了,
// 但是实际上是要先整个读入,然后再进行截断
// if (res.length >= 10) break;
}
let result = 0; // 保存结果
for (let i = res.length - 1; i >= 0; i--) {
result += res[i] * 10 ** (res.length - i - 1);
}
const max = 2 ** 31 - (multi === 1 ? 1 : 0);
result = result > max ? max : result;
return result * multi;
};
官方题解
官方题解很巧妙,使用了「确定有限状态机」。简单的说就是,当遍历字符串的每一个字符时,都有一个当前的状态,然后根据读取的字符决定会变成哪种状态,不同的状态下执行不同的操作,这样就不用写那么多if-else了。 题解链接