String to Integer (atoi)
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
spoilers alert... click to show requirements for atoi.
The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.
The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.
If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.
If no valid conversion could be performed, a zero value is returned. If the correct value is out of the range of representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.
class Solution {
public:
/*
基本思路:
主要是注意转换过程中可能出现的溢出情况
如果不考虑溢出,转换的式子很简单:res = res*10 + cur;
但就是这句话,有可能导致溢出:
第一:当res*10的时候溢出,如,对于8字节的数字 1239,当转换到123时,还没有溢出,但是执行*10时,本身就溢出了,如果不处理,就会造成截断处理
第二:当执行 + cur 时的溢出,这个很好理解
所以代码中需要有两个地方主义溢出检测
2014年9月5日18:45:16
*/
int atoi(const char *str) {
int index = 0;
int flag = 1;
unsigned int res = 0;
if(str == NULL){
return 0;
}
while(*str!='\0'&&*str==' '){
str++;
}
if(*str == '+'){
str++;
}
else if(*str == '-'){
str++;
flag = -1;
}
while(*str!='\0'&&*str>='0'&&*str<='9'){
unsigned int cur = *str - '0';
unsigned int pre = res;
res = res * 10;
//判断是不是由于*10导致溢出
if((res/10) != pre){
if(flag == 1){
return INT_MAX;
}
else{
return INT_MIN;
}
}
//做加法
res += cur;
//做加法以后有可能溢出
if(res >= INT_MAX){
//是负数
if(flag == -1){
//下溢
if( res >= (INT_MAX + 1)){
return INT_MIN;
}
//并没有溢出
str++;
continue;
}
//上溢
return INT_MAX;
}
str++;
}
return flag*res;
}
};