题目描述
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
复制
+2147483647
1a33
输出
复制
2147483647
0
解题思路:
1)判断字符串是否为空
2)首个字符判断正负号
3)后续的字符是否为数字,否则退出
4)每个字符转换
res = (res << 1) + (res << 3) + (str[i] & 0xf);
高位和低位转换
左移是乘以2的次方。(res << 1) + (res << 3) = res * 2 + res * 8 = res * 10 。 字符'0'到'9'的ascii值的低4个二进制位刚好就是0到9所以str[i]&0xf等于str[i]-'0'
参考:https://www.nowcoder.com/questionTerminal/1277c681251b4372bdef344468e4f26e
class Solution {
public:
int StrToInt(string str)
{
int n = str.size(), s = 1;
long long res = 0;//如果不设置为long会出现溢出 2147483648超过
if(!n) return 0;//特殊情况处理
if(str[0] == '-') s = -1;//正负数判断
for(int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < n; ++i)
{ //每个字符转换为整数
if(!('0' <= str[i] && str[i] <= '9')) return 0;
res = (res << 1) + (res << 3) + (str[i] & 0xf);//res=res*10+str[i]-'0';
}
return res * s;
}
};
考虑溢出的情况:
class Solution {
public:
int StrToInt(string str)
{
int n = str.size(), s = 1;
int res = 0;
if(!n) return 0;//特殊情况处理
if(str[0] == '-') s = -1;//正负数判断
for(int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < n; ++i)
{ //每个字符转换为整数
if(!('0' <= str[i] && str[i] <= '9')) return 0;
res = (res << 1) + (res << 3) + (str[i] & 0xf);//res=res*10+str[i]-'0';
}
// 溢出判断
if((s== 1 && res>INT_MAX) || (s== -1 && res*s <INT_MIN))
{
return 0;
}
return res * s;
}
};
出现溢出时,return 0;每个数据类型的最大长度调用系统内部的系统函数,C++内部的:
INT_MAX
2147483647
Maximum (signed) int value
INT_MIN
–2147483647–1
Minimum (signed) int value