/*
* @lc app=leetcode.cn id=8 lang=typescript
*
* [8] 字符串转换整数 (atoi)
*/
// @lc code=start
function myAtoi(s: string): number {}
// @lc code=end
function myAtoi(s: string): number {
let sign = 0
let num = 0
const map = new Set('0123456789-+ ')
const [left, right] = [Math.pow(-2, 31), Math.pow(2, 31) - 1]
for (const c of s) {
// 当遇到其他字符或者有符号位之后遇到 +-空格 的情况下,直接退出
if (!map.has(c) || (sign !== 0 && '+- '.includes(c))) break
// 在遇到符号位之前,遇到空格直接跳过
if (c === ' ') continue
// 遇到 +- 时确定符号位,然后跳过
if ('+-'.includes(c)) {
sign = c === '-' ? -1 : 1
continue
}
// 如果没有符号位,默认位正
if (sign === 0) sign = 1
// 累加数值
num = num * 10 + parseInt(c)
// 根据最大最小值,判断左右边界
if (sign === 1 && num > right) return right
else if (sign === -1 && num * sign < left) return left
}
return num * sign
}
TODO
test.each([
{ input: { s: '42' }, output: 42 },
{ input: { s: ' -42' }, output: -42 },
{ input: { s: '4193 with words' }, output: 4193 },
{ input: { s: 'words and 987' }, output: 0 },
{ input: { s: '-91283472332' }, output: -2147483648 },
{ input: { s: '+1' }, output: 1 },
])('input: s = $input.s', ({ input: { s }, output }) => {
expect(myAtoi(s)).toBe(output)
})