• (剑指Offer)面试题49:把字符串转换为整数


    题目:

    将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。

    思路:

    考虑+、-、空格、非数字字符,以及溢出问题

    代码:

    #include <iostream>
    
    using namespace std;
    
    enum Status {kValid=0,kInvalid};
    int g_nStatus=kInvalid;
    
    long long StrToIntCore(const char* str,bool minus){
        long long num=0;
        int flag=minus?-1:1;
    
        while(*str!=''){
            if(*str>='0' && *str<='9'){
                num=num*10+flag*(*str-'0');
                if((!minus && num>0x7fffffff) || (minus && (signed int)num<0x80000000)){
                    num=0;
                    break;
                }
                str++;
            }
            else{
                num=0;
                break;
            }
        }
        if(*str=='')
            g_nStatus=kValid;
    
        return num;
    }
    
    int StrToInt(const char* str){
        g_nStatus=kInvalid;
        long long num=0;
    
        bool minus=false;
    
        if(str!=NULL && *str!=''){
            while(*str==' '){
                str++;
                if(str==NULL)
                    return 0;
            }
            if(*str=='+')
                str++;
            if(*str=='-'){
                str++;
                minus=true;
            }
            if(*str!='')
                num=StrToIntCore(str,minus);
        }
    
        return (int)num;
    }
    
    
    int main()
    {
        cout << StrToInt("  -998") << endl;
        cout << g_nStatus <<endl;
        Solution s;
        cout << s.StrToInt("123") << endl;
        return 0;
    }

    在线测试OJ:

    http://www.nowcoder.com/books/coding-interviews/1277c681251b4372bdef344468e4f26e?rp=2

    AC代码:

    class Solution {
    public:
        int StrToInt(string str) {
            long long num=0;
            bool minus=false;
            int len=str.length();
    
            if(len==0)
                return 0;
    
            int i=0;
            while(str[i]==' '){
                i++;
            	if(i==len)
                    return 0;
            }
            
            if(str[i]=='+')
                i++;
            else if(str[i]=='-'){
                minus=true;
                i++;
            }
    
            int flag;
            while(i<len){
                flag=minus?-1:1;
                if(str[i]>='0' && str[i]<='9'){
                    num=num*10+flag*(str[i]-'0');
                    if((!minus && num>0x7fffffff) || (minus && (signed int)num<0x80000000)){
                        num=0;
                        break;
                    }
                    i++;
                }
                else{
                    num=0;
                    break;
                }
            }
    
            return (int)num;
        }
    };
  • 相关阅读:
    SPOJ375(树链剖分)
    最短路相关模板、总结
    Linux入门基础#2:Linux文件系统基本结构
    poj 2229 Sumsets (DP)
    Power BI for Office 365(七) Power BI站点
    HDU1045 Fire Net
    Android 系统搜索框(有浏览记录)
    Struts2 Action接收表单参数
    要注意的点
    复习昨天的,继续过Hard题目
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4692802.html
Copyright © 2020-2023  润新知