一、概述
给出一个字符串,将其中的连续数字转换为int。
边界条件很多,都需要考虑。
自己写的,时间复杂度和空间复杂度都还不错。
二、分析
string中有乱七八糟的东西,因此要分为两步做:1、净化 2、转化
最前面要先把空字符串给判断了。
然后说净化,净化不需要判断是否溢出,只要把数字提取出来,代码如下:
private:
int judge(string str, string& temp)
{
int flag=0;
int i=0;
while(str[i]==' ')
i++;
if(str[i]=='-'||str[i]=='+'||(str[i]>='0'&&str[i]<='9'))
{
if(str[i]=='-')
flag=-1;
else
flag=1;
temp+=str[i];
i++;
while(str[i]>='0'&&str[i]<='9')
{
temp+=str[i];
i++;
if(i==str.size())
break;
}
}
else
{
flag=0;
}
return flag;
}
用于判断字符串中是否有合法数字,如果有,提取出来放在temp中。
字符串有以下几种:
经典:+/-加上数字
头空格:空格*n加上经典
不合法尾:经典加上其他符号
不合法头:字母/符号等为头
其中,前三种是可以转换的,最后一种是不可转换的。
之后我们就可以根据返回值来判断该输出什么了。
接着是转化,代码如下:
if(flag==0)
return 0;
else
{
int ans=0;
int i;
if(temp[0]=='+'||temp[0]=='-')
i=1;
else
i=0;
for(;i<temp.size();i++)
{
if(flag==1&&(ans>INT_MAX/10||(ans==INT_MAX/10&&temp[i]-'0'>7)))
return INT_MAX;
if(flag==-1&&(ans>INT_MAX/10||(ans==INT_MAX/10&&temp[i]-'0'>7)))
return INT_MIN;
int add=temp[i]-'0';
ans=ans*10+add;
}
if(flag==1)
return ans;
else
return -ans;
}
注意一点,负数的首字符是'-'而正数可以没有也可以是'+'。因此要首先将正负号排除。
然后关键在判断溢出了。
正数溢出情况:
正数最大是2147483647,当最后一位大于7的时候就溢出;
负数溢出情况:
负数最小是-2147483648,然而只要大于7也是溢出,为什么不是大于8呢?因为我们的ans存的是绝对值,最大可以存的就是
2147483647,如果是>8的话,最小负数会报错,>7虽然返回固定值,但是这个固定值和=8是一个值,因此可以这样判断。
另外,temp[i]-'0'要特意用一个变量储存,否则ans+temp[i]是可能溢出的,或者先-'0'再+temp[i]也行。
然后输出即可。
三、总结
字符串处理问题,不是很难。
PS:代码如下:
class Solution {
private:
int judge(string str, string& temp)
{
int flag=0;
int i=0;
while(str[i]==' ')
i++;
if(str[i]=='-'||str[i]=='+'||(str[i]>='0'&&str[i]<='9'))
{
if(str[i]=='-')
flag=-1;
else
flag=1;
temp+=str[i];
i++;
while(str[i]>='0'&&str[i]<='9')
{
temp+=str[i];
i++;
if(i==str.size())
break;
}
}
else
{
flag=0;
}
return flag;
}
public:
int myAtoi(string str) {
if(str.size()==0)
return 0;
string temp="";
int flag=judge(str,temp);
if(flag==0)
return 0;
else
{
int ans=0;
int i;
if(temp[0]=='+'||temp[0]=='-')
i=1;
else
i=0;
for(;i<temp.size();i++)
{
if(flag==1&&(ans>INT_MAX/10||(ans==INT_MAX/10&&temp[i]-'0'>7)))
return INT_MAX;
if(flag==-1&&(ans>INT_MAX/10||(ans==INT_MAX/10&&temp[i]-'0'>7)))
return INT_MIN;
int add=temp[i]-'0';
ans=ans*10+add;
}
if(flag==1)
return ans;
else
return -ans;
}
}
};