要注意的問題:
- 輸入是空字符串返回0
- 輸入是”0” 也要返回0
- 輸入字符串前面可能有空格,如’ 10’
- 輸入字符串如果溢出了:
- 如果向上溢出,則返回int類型最大值
- 如果向下溢出,則返回int類型最小值
- 如果輸入“+21-” 則應該輸出12 .我之前遇到非invalid的輸入都輸出的是-1(leetcode上需要輸出0)
- 當輸入是int類型最小的整數呢?
- 當輸入是int類型最大的整數加1減1呢?
- 當輸入比int類型的最小值加1,減1呢?
2.錯誤代碼(記錄error)
2.1 錯誤代碼1
int _strToInt2(const char *str){
const int maxLimit= ((unsigned int)0-1)>>1;
const int minLimit= maxLimit+1;
//********************************************************************
int _size=strlen(str); //如果str是NULL,那麼使用strlen會出現error
if(str==NULL || _size==0){
cout<<"The string is empty or empty"<<endl;
return 0;
}
//********************************************************************
int _size=strlen(str);
bool res=true;
bool signal=0;
int sum=0;
int i=0;
if(str[0]=='+'){
++i;
}else if (str[0]=='-'){
++i;
signal=1;
}
while(res&&i<_size){
if( maxLimit<sum || sum<minLimit){
res=false;
cout<<"over flow"<<endl;
}
if('0'<=str[i] && str[i]<='9'){
sum= sum*10+(str[i]-'0');
++i;
}else{
sum=0;
res=false;
}
}
if(signal)
sum=-1*sum;
if(!res){
return sum;
}
return (int)sum;
}
錯誤地方如下:
在
//********************************************************************
之間的代碼。原因是:
如果str是NULL,那麼使用strlen會出現error.(如果最後一個字符不是’\0’結尾,你就不能使用strlen )下面代碼
if( maxLimit<sum || sum<minLimit){ res=false; cout<<"over flow"<<endl; }
- error1:這段括號中的代碼根本不會執行,因爲如果 sum*10 溢出了,那麼此時你比較的就是溢出後的值。
- error2: 這段代碼執行後應該立即跳出循環,但是你寫的並不會直接跳出,還要執行後面的語句
2.2 錯誤代碼2
int _strToInt2(const char *str){
const int maxLimit= ((unsigned int)0-1)>>1;
const int minLimit= maxLimit+1;
if( str==NULL || *str=='\0'){
cout<<"The string is empty "<<endl;
return 0;
}
int _size=strlen(str);
bool res=true;
bool signal=0;
long int sum=0;
int i=0;
if(str[0]=='+'){
++i;
}else if (str[0]=='-'){
++i;
signal=1;
}
while(res&&i<_size){
if(maxLimit/10<sum){
sum=maxLimit;
res=false;
cout<<"over flow"<<endl;
break;
}
if( sum<minLimit/10){
sum=minLimit;
res=false;
cout<<"over flow"<<endl;
break;
}
if('0'<=str[i] && str[i]<='9'){
sum= sum*10+(str[i]-'0');
++i;
}else{
sum=0;
res=false;
}
}
if(signal)
sum=-1*sum;
if(!res){
return sum;
}
return sum;
}
- 錯誤原因
- 如果輸入的字符串前面有空格怎麼辦?
3.ledetcode 上通過代碼
- C++
int myAtoi(string str) {
if(str.empty())
{
cout<<"string is empty"<<endl;
return 0;
}
int MaxLimit=((unsigned int)0-1)>>1;
int MinLimit=MaxLimit+1;
bool sign=false;
int i=0,res=0;
while(i<str.size() && str[i]==' ')
++i;
if(str[i]=='-')
{
++i;
sign=true;
}else if(str[i]=='+'){
++i;
}
while(i<str.size())
{
int oldres=res;
//cout<<s[i]<<endl;
if( '0'<=str[i] && str[i]<='9' )
{
res = res*10 + int(str[i]-'0');
}else{
break;
}
if(res/10!=oldres)
{
if(sign)
res=MinLimit;
else
res=MaxLimit;
break;
}
++i;
}
if(sign)
res=-1*res;
return res;
}
- python (仿製別人)
class Solution(object):
def myAtoi(self, s):
"""
:type str: str
:rtype: int
"""
if(len(s)==0):
return 0
s=s.strip()
l=list(s)
sign=-1 if s[0]=='-' else 1
if(l[0] in ['+','-']):
del l[0]
r,i=0,0
while i<len(l) and l[i].isdigit() :
r=r*10+int(l[i])
i=i+1
r=sign*r
return min(max(-1*2**31,r),2**31-1)