LeetCode #8 Medium

字符串转换整数 (atoi)

更新于:2026-01-27 在 LeetCode 上查看

题目描述

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

函数 myAtoi(string s) 的算法如下:

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1],需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −2^31,大于 2^31 − 1 的整数应该被固定为 2^31 − 1
  6. 返回整数作为最终结果。

示例

输入: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;
}