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

  • 要注意的问题:

    • 输入是空字符串返回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"<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 || sumfalse;
            cout<<"over flow"<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 || sumfalse;
            cout<<"over flow"<
    • 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 "<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"<break;  
        }
        if( sum10){
            sum=minLimit;
            res=false;
            cout<<"over flow"<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"<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<
            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 iand 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)

你可能感兴趣的:(leetcode)