Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

字符串转换成整数

来源Leetcod第8题,字符串转换成整数

请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: “ -42”
输出: -42

库函数里有自带atoi函数可以把字符串里的数字转化为整数,但是题目给定的带有其他字符的字符串,非纯数字字符串,因而我们首先要判断第一位是不是字符,如果是返回0,不是则根据是否空格、整数字符继续判断。
在转化时,注意到INT_MAX=2147483647 INT_MIN=-2147483648,且INT_MIN=-INT_MAX-1,所以在实际转化时最好采用从负数方向开始转化,避免出现溢出。
又由于题目要求在32位大小的有符号数内存储,因而在用两个变量记录INT_MIN/10和INT_MIN%10,当要转化的数小于INT_MIN/10且后续还有数字时,说明发生了溢出,这时只需按题意要求返回INT_MIN或者INT_MAX即可;当待转化的数字为INT_MIN/10且后续还有数字时,需要比较下一位是否比INT_MIN%10小,是的话同样溢出。最后按传入符号输出正负值即可。
代码如下:

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
35
36
37
38
39
40
41
class Solution
{
public:
int myAtoi(string str)
{
int res = 0;
int min_q = INT_MIN / 10;
int min_r = INT_MIN % 10;
int len = 0; //记录数字的长度
int cur = 0;
bool negative = false;// 出现 '-' 置真
int flag_count = 0;
for(char c:str)//判断 正负号 且数字长度为0 防止 "0-1" 这样的情况
{
if((c=='+'||c=='-') && len==0)
{
flag_count++; //记录符号出现次数
negative = c=='-'?true:false;
}
else if(c>='0'&& c<='9' && flag_count<2)//temp<2 表示 正负号 只出现过一次
{
int cur = -1*int(c-'0');
if(res<min_q || (res==min_q && cur<min_r))
{
// INT_MAX=2147483647 INT_MIN=-2147483648
return negative?INT_MIN:INT_MAX;
}
res = res*10 + cur;
len++;
}
else if(c==' ' && len==0 && flag_count==0)
{
continue;
}
else break;
}
if(res==INT_MIN && !negative)
return INT_MAX;
return negative?res:-1*res;
}
};