1.leetcode-字符串处理函数atoi的书写

来源:互联网 发布:淘宝客服平台语言技巧 编辑:程序博客网 时间:2024/05/29 23:25
  • 要注意的问题:

    • 输入是空字符串返回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)
0 0
原创粉丝点击