题目描述
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
class Solution {
public:
int StrToInt(string str) {
if(str.size() == 0)
return 0;
int res = 0;
bool positive;
if (str[0] == '+') {
positive = true;
} else if (str[0] == '-') {
positive = false;
} else if (str[0] >= '0' && str[0] <= '9'){
positive = true;
res += str[0] - '0';
} else
return 0;
for (int i = 1; i < str.size(); i++) {
res *= 10;
if (str[i] >= '0' && str[i] <= '9'){
res += str[i] - '0';
}
else
return 0;
}
return positive ? res : -res;
}
};
方法二:
作者:马客(Mark)
链接:https://www.nowcoder.com/questionTerminal/1277c681251b4372bdef344468e4f26e
来源:牛客网
res = (res << 1) + (res << 3) + (str[i] & 0xf)的原理:
上式与res=res*10+str[i]-'0’是一样的。
左移x位是乘以2的x次方,所以(res << 1) + (res << 3) = res * 2 + res * 8 = res * 10 。
字符’0’到’9’的ascii值的低4个二进制位刚好就是0到9,所以str[i]&0xf等于str[i]-‘0’。
class Solution {
public:
int StrToInt(string str) {
if(str.size() == 0)
return 0;
int res = 0;
int sign = 1;
if(str[0] == '-')
sign = -1;
for (int i = ((str[0] == '-' || str[0] == '+') ? 1 : 0); i < str.size(); i++) {
if (str[i] < '0' || str[i] > '9')
return 0;
res = (res << 1) + (res << 3) + (str[i] & 0xf);
}
return sign * res;
}
};