题目
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:文章来源:https://www.toymoban.com/news/detail-797113.html
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围
[
−
2
31
,
2
31
−
1
]
[−2^{31}, 2^{31} − 1]
[−231,231−1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于
−
2
31
−2^{31}
−231 的整数应该被固定为
−
2
31
−2^{31}
−231 ,大于
2
31
−
1
2^{31} − 1
231−1 的整数应该被固定为
2
31
−
1
2^{31} − 1
231−1 。
返回整数作为最终结果。文章来源地址https://www.toymoban.com/news/detail-797113.html
思路
- 难点—限幅
- 返回值为 r e t ret ret,32位有符号整数范围为 [intMax, intMin],因此判断数字越界时,要始终保持 r e t ret ret 在 int 类型的取值范围内。
- r e t ret ret 更新: r e t = r e t ∗ 10 + n u m ∗ s i g n ret = ret*10+num*sign ret=ret∗10+num∗sign
- 超出范围的情况:
-
r
e
t
ret
ret 为正
- r e t > i n t M a x / 10 ret > intMax/10 ret>intMax/10
- r e t = = i n t M a x / 10 ret == intMax/10 ret==intMax/10 and n u m > i n t M a x num>intMax num>intMax mod 10 10 10
-
r
e
t
ret
ret 为负
- r e t < i n t M i n / 10 ret < intMin/10 ret<intMin/10
- r e t = = i n t M i n / 10 ret == intMin/10 ret==intMin/10 and − n u m < i n t M i n -num<intMin −num<intMin mod 10 10 10
-
r
e
t
ret
ret 为正
代码
class Solution {
public:
int myAtoi(string s) {
int n = s.size();
stack<int> stk;
int start = 0;
int sign = 1;
int ret = 0;
for(int i = 0; i < n; i++){
if(s[i] == ' ')
start++;
else
break;
}
for(int i = start; i < n; i++){
if(i==start && s[i] == '-'){
sign = -1;
}
else if(i==start && s[i] == '+'){
sign = 1;
}
else if(int(s[i]-'0')>=0 && int(s[i]-'0')<=9){
if(sign==1 && ret > INT_MAX/10 || ret == INT_MAX/10&&int(s[i]-'0')>INT_MAX%10)
return INT_MAX;
if(sign==-1 && ret < INT_MIN/10 || ret == INT_MIN/10&&-int(s[i]-'0')<INT_MIN%10)
return INT_MIN;
ret = ret*10 + sign*int(s[i]-'0');
}
else{
break;
}
}
return ret;
}
};
到了这里,关于力扣_字符串1—字符串转整数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!