String To Num

String To Num

题目描述:

给定一个字符串,将其转化为对应的合法的数字。其中字符串可能的输入存在多种情况,需要考虑。如果是非法的转化,返回0;如果是大于2147483647则返回INT_MAX(2147483647);如果是小于-2147483648则返回INT_MIN(-2147483648).见LeetCode8

解题思路:

题目的整体思路不难,主要利用’9’-‘0’来得到对应位数代表的数字,用上一位的累加和乘以10加上当前位数得到结果。需要考虑的部分有:输入的开头可能是空格,我们需要跳过这些字符;当到达第一位非空格的时候,记录下数字的符号;最后需要考虑的是超过整形数字的范围;我们的做法是用base=INT_MAX/10来作为标记;如果在还没到达最后一位的时候,当前已经大于base,则结果一定溢出,所以返回对应符号的数即可,如果是当前值等于base的情况下,判断当前为是否大于7,如果大于7也是同样的做法。当然好几种情况在返回0的情况可以全部合并,写入注释用于提醒。所以做题之前需要多考虑Corner case。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public:
int myAtoi(string str) {
int cur = 0;//记录当前遍历的位置
int base = INT_MAX / 10;//对比大小
int sign = 1;//记录符号
int res = 0;//保存结果
while(str[cur] == ' '){
cur++;
}//过滤掉空格
if (str[cur] == '-' || str[cur] == '+'){
sign = (str[cur] == '+') ? 1 : -1;
cur++;
}//记录符号
while(cur < str.size() && isdigit(str[cur])){
if (res > base || (res == base && str[cur] - '0' > 7))
return sign > 0 ? INT_MAX : INT_MIN;
//判断是否溢出的情况
res = res * 10 + str[cur] - '0';
cur++;
}
return res * sign;
//返回结果
}
};
// if (str[cur] == str.size()) return 0;
//全部是空格的情况
// if (cur == str.size() || str[cur] < 48 || str[cur] > 57) return 0;
//如果是非数字的情况
// while(str[cur] == '0'){
// cur++;
// }
//字符开头是0的情况

1