写一个函数StrToInt,实现把字符串转换成整数这个功能。
- 去除无用的开头空格字符
- 若函数无法进行有效转换,返回0。
输入: “4193 with words”
输出: 4193
解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。
输入: “words and 987”
输出: 0
解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。
因此无法执行有效的转换。
输入: “-91283472332”
输出: -2147483648
解释: 数字 “-91283472332” 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。
思路
考虑边界情况:
- 首个有效字符(非空格或 + 或 - )不是数字直接返回0
- 字符串都是空也返回0
- 出现数字后的任何非数字,则结束遍历,返回当前结果
如何考虑越界问题?
- 这里结果依然用int
- 因为是从左到右遍历,那么就变成临界问题的考虑,对于最大数字是 +2147483647,当前数字是res,考虑两种情况
- res > 214748364:这个时候即时后面是0,依然(已经将最大数字除以10了,后面不能再加任何数字了)超过了最大数字范围,返回INT_MAX或INT_MIN
- res == 214748364:如果后面 > 7,那么不论正负,都已经在边界了,返回INT_MAX或INT_MIN
class Solution {
public:
int strToInt(string str)
{
// 当前数字
int res = 0;
// 标志位,默认为整数
int sign = 1;
int n = str.size();
if (n <= 0) return res;
int i = 0;
// 先找到第一个数字
while(str[i] == ' ')
{
++i;
// 全部字符都是空格
if (i == n)
{
return res;
}
}
// 判断标点符号
sign = str[i] == '-' ? -1 : 1;
if (str[i] == '-' || str[i] == '+')
{
++i;
}
// 边界的数字2147483647 / 10
int edge = 214748364;
// 继续找数字
while (i < n)
{
// 无效字符
if (str[i] < '0' || str[i] > '9')
{
break;
}
// 判断是否超出范围,超过则按照符号来输出 INT_MIN或INT_MAX
int currNum = str[i] - '0';
if ((res > edge) || (res == edge && currNum > 7))
{
cout << res << " " << currNum << endl;
return sign == 1 ? INT_MAX : INT_MIN;
}
res = res * 10 + currNum;
++i;
}
return res * sign;
}
};