飞跃高山与大洋的鱼飞跃高山与大洋的鱼
首页
先看
计算机
  • 数学
  • Linux
  • Arch
  • Manjaro
  • Ubuntu
  • CentOS
  • Kubernetes
  • Web
  • JavaScript
  • TypeScript
  • CSS
  • Canvas
  • Vue
  • Vite
  • NuxtJS
  • Webpack
  • Flutter
  • D3
  • Jest
  • WeApp
  • Utils
  • Nodejs
  • Nestjs
  • Golang
  • Nginx
  • Traefik
  • MySQL
  • MongoDB
  • Redis
  • Docker
算法
  • 像素风
  • Git
  • Github
  • VSCode
  • Chrome
  • Google
  • Bookmark scripts
  • 导航 🎉
  • VuePress 侧边栏插件
  • VuePress 官网
🚇 开往
首页
先看
计算机
  • 数学
  • Linux
  • Arch
  • Manjaro
  • Ubuntu
  • CentOS
  • Kubernetes
  • Web
  • JavaScript
  • TypeScript
  • CSS
  • Canvas
  • Vue
  • Vite
  • NuxtJS
  • Webpack
  • Flutter
  • D3
  • Jest
  • WeApp
  • Utils
  • Nodejs
  • Nestjs
  • Golang
  • Nginx
  • Traefik
  • MySQL
  • MongoDB
  • Redis
  • Docker
算法
  • 像素风
  • Git
  • Github
  • VSCode
  • Chrome
  • Google
  • Bookmark scripts
  • 导航 🎉
  • VuePress 侧边栏插件
  • VuePress 官网
🚇 开往
  • ALGORITHMS

    • 算法
    • 两数之和
    • 整数反转
    • 字符串转换整数 (atoi)
      • 自动机
    • 回文数
    • 罗马数字转整数
    • 最长公共前缀
    • 删除链表的倒数第 N 个结点
    • 有效括号
    • 合并两个有序链表
    • 删除排序数组中的重复项
    • 移除元素
    • 实现 strStr
    • 搜索插入位置
    • 有效的数独
    • 外观数列
    • 旋转图像
    • 最大子序和
    • 跳跃游戏
    • 最后一个单词的长度
    • 加一
    • 求平方根
    • 爬楼梯
    • 删除排序链表中的重复元素
    • 合并两个有序数组
    • 二叉树的中序遍历
    • 验证二叉搜索树
    • 相同的树
    • 对称二叉树
    • 二叉树的层序遍历
    • 二叉树的最大深度
    • 将有序数组转为二叉搜索树
    • 平衡二叉树
    • 二叉树的最小深度
    • 路径总和
    • 杨辉三角
    • 杨辉三角 II
    • 买卖股票的最佳时机
    • 验证回文串
    • 只出现一次的数字
    • 环形链表
    • 二叉树的前序遍历
    • 二叉树的后序遍历
    • 最小栈
    • 相交链表
    • 两数之和 II - 输入有序数组
    • Excel 表列名称
    • 多数元素
    • Excel 表列序号
    • 组合两个表
    • 超过经理收入的员工
    • 超找重复的电子邮箱
    • 从不订购的客户
    • 颠倒二进制位
    • 位 1 的个数
    • 有效电话号码
    • 第十行
    • 删除重复的电子邮箱
    • 上升的温度
    • 打家劫舍
    • 快乐数
    • 移除链表元素
    • 计数质数
    • 同构字符串
    • 反转链表
    • 打家劫舍 II
    • 存在重复元素
    • 存在重复元素 II
    • 用队列实现栈
    • 翻转二叉树
    • 汇总区间
    • 2 的幂
    • 用栈实现队列
    • 回文链表
    • 二叉搜索树的最近公共祖先
    • 删除链表中的节点
    • 有效的字母异位词
    • 二叉树的所有路径
    • 各位相加
    • 丑数
    • 丢失的数字
    • 第一个错误的版本
    • 移动零
    • 单词规律
    • Nim 游戏
    • 区域和检索 - 数据不可变
    • 零钱兑换
    • 3 的幂
    • 比特位计数
    • 4 的幂
    • 反转字符串
    • 反转字符串中的元音字母
    • 两个数组的交集
    • 两个数组的交集 II
    • 有效的完全平方数
    • 猜数字大小
    • 赎金信
    • 打乱数组
    • 字符串中的第一个唯一字符
    • 找不同
    • 判断子序列
    • 二进制手表
    • 左子叶之和
    • 数字转换为十六进制数
    • 最长回文串
    • Fizz Buzz
    • 第三大的数
    • 字符串相加
    • 字符串中的单词数
    • 排列硬币
    • 找到数组中消失的所有数字
    • 分发饼干
    • 重复的子字符串
    • 汉明距离
    • 岛屿的周长
    • 数字的补数
    • 密钥格式化
    • 最大连续 1 的个数
    • 构造矩形
    • 提莫攻击
    • 下一个更大元素 I
    • 键盘行
    • 二叉搜索树中的众数
    • 七进制数
    • 相对名次
    • 完美数
    • 斐波那契数
    • 检测大写字母
    • 最长特殊序列 Ⅰ
    • 二叉搜索树的最小绝对差
    • 反转字符串 II
    • 二叉树的直径
    • 学生出勤记录 I
    • 反转字符串中的单词 III
    • N 叉树的最大深度
    • 数组拆分
    • 二叉树的坡度
    • 重塑矩阵
    • 另一棵树的子树
    • 分糖果
    • N 叉树的前序遍历
    • N 叉树的后序遍历
    • 最长和谐子序列
    • 大的国家
    • 超过 5 名学生的课
    • 范围求和
    • 两个列表的最小索引总和
    • 种花问题
    • 根据二叉树构造字符串
    • 合并二叉树
    • 有趣的电影
    • 变更性别
    • 三个数的最大乘积
    • 二叉树的层平均值
    • 子数组最大平均数
    • 错误的集合
    • 两数之和 IV - 输入 BST
    • 机器人能否返回原点
    • 图片平滑器
    • 二叉树中第二小的节点
    • 最长连续递增序列
    • 验证回文字符串 Ⅱ
    • 棒球比赛
    • 交替位二进制数
    • 二叉搜索树中的搜索
    • 设计哈希集合
    • 设计哈希映射
    • 转换成小写字母
    • 寻找数组的中心下标
    • 使用最小花费爬楼梯
    • 至少是其他数字两倍的最大数
    • 宝石与石头
    • 保持城市天际线
    • 可以被一步捕获的棋子数
    • 第 N 个泰波那契数
    • 一年中的第几天
    • 比赛中的配对次数
    • 截断句子

字符串转换整数 (atoi)

一开始写了一堆判断,看到官方题解就默默删除了原答案,太 low 了。

自动机

‘ ’+/-numberother
startstartsignedin_numberend
signedendendin_numberend
in_numberendendin_numberend
endendendendend
enum STATES {
  START,
  SIGNED,
  IN_NUMBER,
  END
}

enum SIGNS {
  POSITIVE,
  NEGATIVE
}

const max = 2 ** 31 - 1
const min = -(2 ** 31)

class AutoMaton {
  public sign = SIGNS.POSITIVE
  public ans = 0

  private state = STATES.START
  private table = {
    [STATES.START]: [STATES.START, STATES.SIGNED, STATES.IN_NUMBER, STATES.END],
    [STATES.SIGNED]: [STATES.END, STATES.END, STATES.IN_NUMBER, STATES.END],
    [STATES.IN_NUMBER]: [STATES.END, STATES.END, STATES.IN_NUMBER, STATES.END],
    [STATES.END]: [STATES.END, STATES.END, STATES.END, STATES.END]
  }

  private getColIndex(c: string): number {
    if (c === ' ') return 0
    if (c === '+' || c === '-') return 1
    if (/^[0-9]$/.test(c)) return 2
    return 3
  }

  public process(c: string) {
    this.state = this.table[this.state][this.getColIndex(c)]

    if (this.state === STATES.IN_NUMBER) {
      this.ans = this.ans * 10 + Number(c)
      this.ans = this.sign === SIGNS.POSITIVE
        ? Math.min(this.ans, max)
        : Math.min(this.ans, -min)
    } else if (this.state === STATES.SIGNED) {
      this.sign = c === '+'
        ? SIGNS.POSITIVE
        : SIGNS.NEGATIVE
    }
  }
}

function myAtoi(s: string): number {
  const automaton = new AutoMaton()
  for (const char of s) {
    automaton.process(char)
  }

  return (automaton.sign === SIGNS.POSITIVE ? 1 : -1) * automaton.ans
}
编辑文档!
上次更新:
贡献者: shanyuhai123
Prev
整数反转
Next
回文数