-
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入一个字符串,包括数字字母符号,可以为空
如果是合法的数值表达则返回该数字,否则返回0
- 输入
+2147483647 1a33
- 输出
2147483647 0
-
思路一,乘以10加下一个数。设置一个变量用来存储转换后的结果,每遍历一个字符如果是数字的话就把当前结果乘以10加上新的数,如果字符
>='0'
且<='9'
则该字符为数字,字符与数字之间的转换可以用字符减去'0'
字符来得到,因为在ASCII
编码中数字0-9
是连着的,也可以用map
即哈希表或者switch...case
来进行。一旦发现不合法直接返回0
。-
开头的时候要把前面的空格滤掉,从第一个非空格的字符开始。
-
正负号可以单独用一个变量来保存,可以是
int
也可以是bool
类型,最后把正负号乘到结果中。 -
结果可以用
long long
来保存,代码中可以判断结果是否对int
越界。为什么不用long
呢?在32位系统中,int, long int, long
都是4字节,而long long
为8字节。 -
还可以设置一个枚举类型或者
bool
类型的全局变量,表示转换是否成功,这样就知道输出0
的时候到底是因为转换失败了还是因为是输入的就是0
。
-
- 思路一,乘以10加下一个数。如果要求不严格的话可以不做溢出检测和首尾空格去除。
class Solution {
public:
bool Success = true;
int StrToInt(string str) {
int length = str.size();
if(length<1) {Success=false; return 0;}
// 去掉开头的空格
int p = 0;
while(str[p] == ' ') p++;
// 正负号,true为正,false为负
bool posFlag = true;
if(str[p]=='+'){p++;}
else if(str[p]=='-'){posFlag=false; p++;}
// 转换
long long result = 0;
while(p<length){
// 合法输入
if(str[p]>='0' && str[p]<='9'){
result = result*10 + (str[p]-'0');
p++;
// 溢出检测
if((posFlag && result>0x7FFFFFFF) || (!posFlag && result>0x80000000)){
Success =false;
return 0;
}
}
// 去除结尾空格
else if(str[p]==' '){p++; break;}
// 非法输入
else{
Success = false;
return 0;
}
}
// 去除结尾空格
while(p<length){
if(str[p] != ' ') {Success=false; return 0;}
p++;
}
return posFlag ? result : -result;
}
};