zoukankan      html  css  js  c++  java
  • 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
    时间才能证明一切,选好了就尽力去做吧!
  • 相关阅读:
    TreeView拖动
    反射机制
    SQLServer2005/2008 XML数据类型操作
    开发与研发:一字之差的感想
    设置在64位机器上的IIS(IIS6/IIS7)兼容32位程序(64位ODBC和32位ODBC的问题同样适用)
    setTimeout和setInterval的使用
    Oracle 安装/使用、配置/卸载
    链接sql数据库以及Oracle 数据库和启动缓存以及停止缓存
    jQuery学习笔记—— .html(),.text()和.val()的使用
    C# List<T>用法
  • 原文地址:https://www.cnblogs.com/tingxilin/p/12173476.html
Copyright © 2011-2022 走看看