1.题目
2.思路
这道题只要把各种情况想清楚就行:
- 去掉字符串前面的空格,只要遍历字符,碰到空格,直接跳过就行,但是注意跳过空格时候,判断是否下标会越界,越界直接返回;
- 判断前面第一个字符是否为+ - 正负号,是的话,也直接跳过,为了使得最终结果是可以表示正负号的效果,我们可以提前设置一个变量来保存正负号的值,+号用1表示,-号用-1表示,最终结果乘于该变量即可;
- 判断是否为数字,假如字符不是数字,那么直接返回即可
- 判断是数字时候就拼接结果,但是,拼接结果时候,要判断越界问题:如何判断呢?我们可以通过设置一个变量,保存 INT_MAM / 10的结果,假如 求出的结果 > INT_MAX / 10的值,那么就不要继续拼接下一个数字到结果变量了,因为,拼接过去肯定是越界的;还有一种情况是求出的结果 ==INT_MAX / 10,并且下一个要拼接的数字 > 7,那么也不需要继续拼接到结果集了,因为这肯定也是越界的;
class Solution {
//四种情况判断
//1.去掉前面的空格
//2.跳过正负号
//3.判断是否为数字
//4.字符转换数字,并且判断越界的问题
public:
int strToInt(string str) {
int i = 0; //遍历字符串的下标
int flag = 1; //判断正负号的值
int bndry = INT_MAX / 10; //判断越界的值
int res = 0; //存放结果的遍历
if(str.size() == 0) return 0;
while(str[i] == ' ') //跳过空格
{
++i;
if(i == str.size()) //假如跳空格的过程到达字符串的尾部,那么就直接返回
return 0;
}
//跳过正负号,如果是符号那么就先设置flag值
if(str[i] == '-')
flag = -1;
if(str[i] == '-' || str[i] == '+')
++i;
for(size_t pos = i;pos<str.size();++pos)
{
//非数字直接pass
if(str[pos] <'0' || str[pos] >'9')
break;
//是数字检查结果是否越界,越界直接返回最大或最小值
if(res > bndry || (res == bndry && str[pos] > '7'))
return flag == 1 ? INT_MAX:INT_MIN;
//把字符拼接到数字结果上
res = res*10+(str[pos] -'0');
}
return flag* res;
}
};