题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
返回值描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647 1a33
返回值
2147483647 0
题解
题目意思很明确,这道题难就难在边界的考察。如果对于一般规则的数字“字符串”转化为数字都很容易,比如:
对于“123456”可以利用如下代码进行转化:
int ans = 0;
for (int i=0; i<str.size(); ++i) {
ans = ans * 10 + (str[i] - '0');
}
int的范围为
如果超过了这两个范围该怎么办?
其实也很简单,首先判断这个数的正负,如果正数,超过了INT_MAX,就设置为INT_MAX,如果是负数,首先我们不考虑负号,如果超过了INT_MAX+1, 则就置为INT_MAX+1, 最后再根据正负号,来加负号。
bool neg = str[i]=='-' ? true : false;
i = isdigit(str[i]) ? i : i+1;
long long ans = 0L; // 因为INT_MAX+1超过了int的范围
while (i < len && isdigit(str[i])) {
ans = ans * 10 + (str[i++]-'0');
if (!neg && ans > INT_MAX) {
ans = INT_MAX;
break; //因为此处以为最大值,所以直接break
}
if (neg && ans > 1L + INT_MAX) {
ans = 1L + INT_MAX;
break;
}
}
最后再考虑一些特殊情况即可。
代码如下:
class Solution {
public:
int StrToInt(string str) {
int len = str.size();
if(len == 0)
return 0;
int i = 0;
while(i <len && str[i] == ' ') //排除开头的空格
i++;
if(i == len)
return 0;
if(!isdigit(str[i]) && str[i] != '+' && str[i] != '-') //出现了非数字,也不是正负号,如第二个例子
return 0;
bool neg = str[i]=='-' ? true : false;
i = isdigit(str[i]) ? i : i+1;
long long ans = 0L;
while(i<len && isdigit(str[i])){
ans = ans * 10 + (str[i] - '0');
i += 1;
if(!neg && ans > INT_MAX){
ans = INT_MAX;
break;
}
if(neg && ans < 1L + INT_MIN){
ans = 1L + INT_MIN;
break;
}
}
if(i != len)
return 0;
return !neg ? static_cast<int>(ans) : static_cast<int>(-ans);
int num = 0;
for(int i=0; i<str.size(); i++){
num = num * 10 + str[i] - '0';
}
}
};