题目
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
思路
- 这道题的主要思路就是,用res记录结果,每次取一个字符数字n,然后res = res * 10 + (n-‘0’)。
- 主要问题在于边界问题的处理。
- int的范围为-2147483648~2147483647。要避免res溢出。所以在每次累和之前,要先判断加起来会不会溢出。
代码
class Solution {
public:
int StrToInt(string str) {
if ( str.size() == 0 ) return 0;
int sign = 1;
int index = 0;
unsigned int res = 0;
// 确定符号,然后跳过符号
if ( str[0] == '+' )
++index;
else if ( str[0] == '-' ) {
sign = -1;
++index;
}
if ( str[index] == '0' ) return 0; // 如果第一个数字为0,则不合法。
while ( index < str.size() ) {
if ( !isNum( str, index ) ) // 不是数字不合法
return 0;
int curNum = str[index] - '0';
if ( !isValid( res, curNum, sign ) ) //主要看大小
return 0;
res = res * 10 + curNum;
++index;
}
return res * sign;
}
bool isNum( string& str, int index ) {
return str[index] >= '0' && str[index] <= '9';
}
bool isValid( unsigned int sum, int num, int sign ) {
if ( sum > INT_MAX / 10 )
return false;
if ( sum == INT_MAX / 10 ) {
if ( sign == 1 && num > 7 ) return false;
if ( sign == -1 && num > 8 ) return false;
}
return true;
}
};