您的位置:首页 > 其它

String to Integer (atoi)

2015-11-19 15:37 447 查看
这题写的好惨啊,各种情况

1、丢弃前面空白和数字后面东西

2、数字是会连续输入的或者是和符号一起输出的,中间有其他的字符都会视为无效,数字前有其他字符也会视为无效。

3、0777视为777的,注意整数溢出。

class Solution {
public:
int myAtoi(string str) {
if(str.empty()) return 0;
string::iterator first=str.begin(),end=str.end();
int n=0,op_tag=0,num_tag=0,space_tag=0;
long long max=2147483647,num=0;
char op='+';
while(first!=end)
{
while(*first==' '){first++;space_tag=1;}
if(*first=='+'||*first=='-' )
{
if(op_tag==0)
{
op=*first;
op_tag=1;
first++;

}
else return 0;
}
if((first != end) &&isdigit(*first))
{
while((first != end) && isdigit(*first))
{
n=*first-'0';
num=num*10+n;
first++;
num_tag=1;
if(num > max)break;
}
}
else break;
if(num_tag==1||space_tag==1||op_tag==1) break;
first++;
}
if(op=='-')
{
if(num >(max+1))num =-(max+1);
else num=-num;
}
else if(op== '+')
{
if(num>max) num=max;
}
return num;

}
};


如果把指针改为下标会简练一些,下面是网上的思路


int atoi(const char *str) {
int sign = 1, base = 0, i = 0;
while (str[i] == ' ') { i++; }
if (str[i] == '-' || str[i] == '+') {
sign = 1 - 2 * (str[i++] == '-');
}
while (str[i] >= '0' && str[i] <= '9') {
if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
if (sign == 1) return INT_MAX;
else return INT_MIN;
}
base  = 10 * base + (str[i++] - '0');
}
return base * sign;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: