Skip to content

字符串转换整数(atoi)

中等

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

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

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

注意:

  • 本题中的空白字符只包括空格字符 ' '
  • 除前导空格或数字后的其余字符串外,*请勿忽略** 任何其他字符。

提示:

  • 0 <= s.length <= 200
  • s 由英文字母(大写和小写)、数字(0-9)、' ''+''-''.'` 组成

题解

这道题简单的方式是直接使用 parseInt 来做,需要进行细节处理:如果 parseInt 结果为 NaN,则返回 0,如果超过 32 位有符号整数范围,则进行固定

typescript
var myAtoi = function (s) {
  s = parseInt(s);
  if (isNaN(s)) return 0;

  let min = Math.pow(-2, 31);
  let max = Math.pow(2, 31) - 1;

  if (s < min) return min;
  if (s > max) return max;
  return s;
};

如果不借助 parseInt,也可以自己对字符串进行处理转换,步骤如下

  1. 去除原字符串的头尾空格
  2. 判断有无正负符号
  3. 循环拼接数字,当不是数字则终止循环(注意对空格的处理,在 js 中空格会被转换为 0)
  4. 对结果进行转换,判断是否超出范围
typescript
var myAtoi = function (s) {
  // 去除字符串首尾的空格
  s = s.trim();
  // 新建变量接收转换结果
  let res = "";
  // 判断正负符号
  if (s[0] === "+" || s[0] === "-") {
    res = s[0];
    // 去除正负符号
    s = s.slice(1);
  }

  // 循环
  for (let i = 0; i < s.length; i++) {
    if (s[i] >= 0 && s[i] <= 9 && s[i] !== " ") {
      // 如果为数字则拼接
      res += s[i];
    } else {
      // 如果不是数字则结束循环
      break;
    }
  }

  // 处理结果只有一个符号的情况:例如 "+dssdds" => "+"
  if (res === "+" || res === "-") res = "";

  let min = Math.pow(-2, 31);
  let max = Math.pow(2, 31) - 1;

  r = Number(r);
  if (r < min) r = min;
  if (r > max) r = max;
  return r;
};