Skip to content

Latest commit

 

History

History
63 lines (54 loc) · 1.52 KB

8.字符串转换整数-atoi.md

File metadata and controls

63 lines (54 loc) · 1.52 KB

8.字符串转换整数-atoi

/*
 * @lc app=leetcode.cn id=8 lang=typescript
 *
 * [8] 字符串转换整数 (atoi)
 */

// @lc code=start
function myAtoi(s: string): number {}
// @lc code=end

解法 1: 遍历每个字符

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
}

解法 2: 状态机

TODO

Case

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)
})