动态规划—字符串转换整数 (atoi)

180 阅读2分钟

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战

Hope is a good thing, maybe the best of things. And no good thing ever dies—— 《The Shawshank Redemption》

前言

动态规划的算法系列是面试中经常见到的算法类型题,前面的一篇文章我们大致介绍了一下什么是动态规划、动态规划的特点:动态规划—斐波那契数,昨天又学习了一道关于动态的规划的题目:动态规划—最大子数组和

今天继续来学习一道关于动态规划的算法题来加强算法能力。

题目

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

示例 1:
输入: s = "42"
输出: 42

示例 2:
输入: s = "   -42"
输出: -42

示例 3:
输入: s = "4193 with words"
输出: 4193

解题思路

  • 去掉首尾空格之后,如果第一个符号为-,则表示负号
  • 如果第一个符号为+,则表示正数,当然+是可选的
  • 遍历去掉首尾空格后的字符串,如果当前字符是数字,则累加(累加的时候判断是否溢出,如果溢出则直接按照题意返回就行了),否则就可以直接退出了

算法代码

/**
 * @param {string} s
 * @return {number}
 */
var myAtoi = function (s) {
  let res = 0,
    // 正负号,默认正号
    negativeSymbol = 1;
  // 把首尾的空格都去掉
  s = s.trim();
  for (let i = 0; i < s.length; i++) {
    // 负数
    if (i == 0 && s[i] == "-") {
      negativeSymbol = -1;
      continue;
      // 正数
    } else if (i == 0 && s[i] == "+") continue;
    // 因为空格会被转成0,所以要排除空格的情况,也就是说在数字范围内就加上
    if (s[i] >= 0 && s[i] <= 9 && s[i] != " ") {
      res = res * 10 + (s[i] - 0);
      // 为什么在这里就判断呢,因为这里如果就溢出的话,就直接跳出,不需要再后面无意义的计算了
      if (res * negativeSymbol <= -2147483648) return -2147483648;
      else if (res * negativeSymbol >= 2147483647) return 2147483647;
    } else break;
  }
  return res * negativeSymbol;
};

执行结果

image.png

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏

欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后