• 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
    时间才能证明一切,选好了就尽力去做吧!
  • 相关阅读:
    八皇后之回溯算法
    手撕堆排序 优先级队列的实现方式
    扩展1000!(n!)的尾数零的个数
    #12. 整数转罗马数字 穷举法
    #11 盛最多水的容器
    Sql Server 复制数据库
    常见dos命令行
    JSP页面中,EL表达式获取根路径。
    maven springTest结合junit单元测试
    【Java异常】Exception in thread“main” java util ConcurrentModificationException的解决方案
  • 原文地址:https://www.cnblogs.com/tingxilin/p/12173476.html
Copyright © 2020-2023  润新知