【C++】剑指offer 67. 把字符串转换成整数
算法流程:
-
先将字符串中最开始满足要求的数字字符串提取出至
tmp
(提取过程判断正负号,提取出的字符串不带符号,有前缀0) -
在循环外去除前缀0
-
然后根据位数判断是否有匹配或越界
-
当
位数 == 0
,说明无匹配情况,返回0 -
当
位数 > 10
,再根据符号返回INT_MAX
或INT_MIN
; -
若
位数 == 10
,根据string类自带的 > 比较(字典序)- 先判断符号
- 正号,
tmp
与字符串类型的INT_MAX("2147483647"
)比较,越界返回INT_MAX
- 负号,
tmp
与字符串类型的INT_MIN("2147483648"
)比较,越界返回INT_MIN
-
-
剩下的情况为正常数据,使用循环转化为整型,再根据符号返回值即可
C++代码
int strToInt(string str) {
string tmp;
int digit = 0;
int flag = 0; //是否遇到一次符号或者数字
int sig = 1; //符号
for (auto x : str) { //先提取字符串
if (x == ' ') {
if (flag) break; //在数字后面有空格则跳出
continue;
}
if ((x < '0' || x > '9') && (x != '-' && x != '+')) {
break;
}
if (x == '-' || x == '+') {
if (flag) break; //已经遇到过数字或符号,再次遇到符号就跳出
if (x == '-') {
sig = -1;
}
flag = 1;
continue; //符号不写进tmp
}
flag = 1;
tmp += x;
}
int i = 0;
for (i = 0; i < tmp.size(); ++i) {
if (tmp[i] != '0') break;
}
tmp = tmp.substr(i, tmp.size() - i);
if (tmp.size() == 0) return 0;
if (tmp.size() > 10) {
if (sig == 1) return INT_MAX;
if (sig == -1) return INT_MIN;
}
if (tmp.size() == 10) {
if (sig == 1 && tmp >= "2147483647") {
return INT_MAX;
}
if (sig == -1 && tmp >= "2147483648") {
return INT_MIN;
}
}
for (int i = 0; i < tmp.size(); ++i) {
digit = digit * 10 + tmp[i] - '0';
}
return sig * digit;
}