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"<<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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章