leetcode每日刷题计划--day63

期末考试结束了

Num 8 字符串转整数(atoi)

题目本身没有难点:几个容易理解错的点

  • --32是不合法的(正负号只能有一个)
  • +32合法(可以添加+)
  • word123是不合法的(只要第一个非空不是数字或者正负号就不行)

我犯错的样例:2147483648

刚开始看到一个思路是用 ans和INT_MAX/10比来规避溢出,实际上要考虑到等号的时候,对于INT_MAX 如果str是8或者9是会溢出的,对于INT_MIN,str9溢出

写的numpd要注意,不能判断+-,所以end从first+1开始。并且因为end是符合+1,最后的str[end]是不符合的第一个,这时候就需要end=end-1,变回真实的有效值

class Solution {
public:
        bool numpd(string str,int num)
        {
            if(str[num]>='0' && str[num]<='9')
                return true;
            return false;
        }
        int changeone(string str,int first,int end)
        {
            int len=end-first;
            long ans=0;
            for(int i=first+1;i<=end;i++)
            {
                //printf("one");
                if(str[first]=='-')
                {
                   // cout<<abs(ans)<<" "<<INT_MIN/10<<endl;
                    if(abs(ans)>INT_MAX/10||(abs(ans)==INT_MAX/10 && str[i]=='9'))
                        return INT_MIN;
                    ans=ans*10+'0'-str[i];
                    //printf("hah");
                }
                else
                {
                    //cout<<ans<<endl;
                    if(ans>INT_MAX/10 || (ans==INT_MAX/10 && str[i]>='8'))
                        return INT_MAX;
                    ans=ans*10+str[i]-'0';
                }
            }
            return ans;
        }
        int changesecond(string str,int first,int end)
        {
            int len=end-first+1;
            long ans=0;
            for(int i=first;i<=end;i++)
            {
                //cout<<"this"<<ans<<endl;
                if(ans>INT_MAX/10 || (ans==INT_MAX/10 && str[i]>='8'))
                    return INT_MAX;
                ans=ans*10+str[i]-'0';
            }
            //if(ans<=INT_MIN) return INT_MIN;
            return ans;
        }
    int myAtoi(string str) {
        int first=0;
        int end=0;
        int len=str.length();
        while(first<len && str[first]==' ')
            first++;
        if(first==len ||(numpd(str,first)==false && str[first]!='+'&&str[first]!='-'))
            return 0;
        //printf("hah");
        end=first+1;//避免负号
        while(end<len && numpd(str,end))
            end++;
        end=end-1;
        if(end<first && (str[first]=='-'||str[first]=='+'))
            return 0;
        if (str[first]=='-'||str[first]=='+')
            return changeone(str,first,end);
        else 
            return changesecond(str,first,end);
    }
};
View Code

猜你喜欢

转载自www.cnblogs.com/tingxilin/p/12173476.html