(剑指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!='\0'){
        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=='\0')
        g_nStatus=kValid;

    return num;
}

int StrToInt(const char* str){
    g_nStatus=kInvalid;
    long long num=0;

    bool minus=false;

    if(str!=NULL && *str!='\0'){
        while(*str==' '){
            str++;
            if(str==NULL)
                return 0;
        }
        if(*str=='+')
            str++;
        if(*str=='-'){
            str++;
            minus=true;
        }
        if(*str!='\0')
            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;
    }
};
posted @ 2015-07-31 17:41  AndyJee  阅读(698)  评论(0编辑  收藏  举报