「这是我参与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;
};
执行结果
结语
如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。
文章如有错误之处,希望在评论区指正🙏🙏
欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后 」