ID:8.字符串转换整数 (atoi)

79 阅读1分钟

题目链接

思路

分情况处理,写了一堆if-else

var myAtoi = function (s) {
  // 空字符串返回0
  if (s.length === 0) return 0;

  let cur = 0; // 记录当前字符串下标

  // 丢弃前导空格,并判断删除前导空格后是否为空字符串
  while (s[cur] === " ") cur++;
  if (cur >= s.length) return 0;

  // 决定结果是正还是负
  let multi = 1;
  if (s[cur] === "-") {
    multi = -1;
    cur++;
  } else if (s[cur] === "+") {
    multi = 1;
    cur++;
  } else if (s.charCodeAt(cur) < 48 || s.charCodeAt(cur) > 57) {
    return 0;
  }

  const res = []; // 保存已经读入的字符
  for (; cur < s.length; cur++) {
    let num = s.charCodeAt(cur) - 48;
    if (num < 0 || num > 9) break;
    res.push(num);
    // 👇这行代码理解错了,以为超过整数范围以后就不读入了,
    // 但是实际上是要先整个读入,然后再进行截断
    // if (res.length >= 10) break;
  }

  let result = 0; // 保存结果
  for (let i = res.length - 1; i >= 0; i--) {
    result += res[i] * 10 ** (res.length - i - 1);
  }
  const max = 2 ** 31 - (multi === 1 ? 1 : 0);
  result = result > max ? max : result;
  return result * multi;
};

官方题解

官方题解很巧妙,使用了「确定有限状态机」。简单的说就是,当遍历字符串的每一个字符时,都有一个当前的状态,然后根据读取的字符决定会变成哪种状态,不同的状态下执行不同的操作,这样就不用写那么多if-else了。 题解链接