String to Integer (atoi)
在C++中将字符串类型转化为int类型,可以用到atoi函数,这个题目就是自己完成atoi,同时如果需要将string类型转化为int类型,那么需要先将string类型转化为char类型
int i ;
string str;
i = atoi(str.c_str())
这个题目比较简单,但是有很多的边界条件需要考虑
1:如果字符串前面有多个空格,那么应该忽略,直至第一个有效数据
2:注意正负号
3:在数字之后可能还有很多非数值的数据,应该舍弃
4:注意int类型的取值范围(-2147483648,2147483647)
下面是自己写的代码:
class Solution {
public:
int atoi(const char *str) {
int size = strlen(str);
int i = 0;
int rt = 0;
int temp;
char IsPlus = 1;
while(str[i] == ' ')
{
i++;
}
if(((str[i] == '+') || (str[i] == '-')) && (i < size))
{
if(str[i] == '+')
{
IsPlus = 1;
i++;
}
else
{
IsPlus = -1;
i++;
}
}
while((temp = IsValid(str[i])) == 0 && (i < size))
{
i++;
}
while((temp = IsValid(str[i])) >= 0 && (i < size))
{
if(rt*IsPlus > (2147483647-temp)/10) //<不能将数据加了之后再比较,因为可能已经溢出,数据则比较奇怪
{
return 2147483647;
}
if(rt*IsPlus < (-2147483648+temp)/10)
{
return -2147483648;
}
rt = rt*10+temp;
i++;
}
return rt*IsPlus;
}
int IsValid(const char inputStr)
{
switch(inputStr)
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
default:
return -1;
}
}
};
感觉自己写的代码比较冗余,在网上找到的比较好的代码:
class Solution {
public:
int atoi(const char *str) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(str == NULL) return 0;
bool sign = true;
while (*str == ' ')//prefix ' '
str++;
if(*str == '+' || *str == '-')
{
if(*str == '+') sign = true;
else sign = false;
str++;
}
long long ans = 0;
while(*str >= '0' && *str <= '9')
{
ans = ans*10+(*str-'0');
if(ans > INT_MAX) return sign == true ? INT_MAX : INT_MIN;
str++;
}
if(sign == false) return (int)(-ans);
else return (int)ans;
}
};
相对于自己写的代码:
1:明知道用int类型,可能溢出导致数据不准确,那么定义的时候可以定义一个long long类型
2:在获取有char专为数字的时候,不应该用冗余的switch分支,*str-'0'简单很多