码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode String to Integer (atoi)

时间:2014-09-20 01:08:46      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   使用   ar   数据   div   

class Solution {
public:
    int atoi(const char *str) {
        if (str == NULL) return 0;
        long val =0, pos = 0;
        char ch = \0;
        int stage = 0; // 0-initial, 1-sign-collected, 2-digit-collected, 3-end 
        bool positive = true;
        int pos_threshold = INT_MAX / 10;
        int neg_threshold = INT_MIN / 10;
        while(stage < 3 && (ch = str[pos]) != \0) {
            switch(stage) {
                case 0: // initial stage
                    if (ch == - || ch == +) {
                        // sign detected
                        positive = ch == +;
                        stage = 1;
                        pos++;
                    } else if (ch >= 0 && ch <= 9) {
                        // digit detected
                        stage = 2;
                    } else if (ch ==   || ch == \t || ch == \n) {
                        // leading white space
                        pos++;
                    } else {
                        // other chars, invalid str to convert
                        stage = 3;
                    }
                    ;break;
                case 1: // sign-collected stage
                    if (ch >= 0 && ch <= 9) {
                        // digit after sign
                        stage = 2;
                    } else {
                        // other chars, invalid str to convert
                        stage = 3;
                    }
                    ;break;
                case 2: // number detected stage
                    if (ch >= 0 && ch <= 9) {
                        // digits
                        int pre_val = val;
                        if (positive) {
                            val = val * 10 + (ch - 0);
                            if (pre_val > pos_threshold || val < pre_val) {
                                stage = 3;
                                val = INT_MAX;
                            }
                        } else {
                            val = val * 10 - (ch - 0);
                            if (pre_val < neg_threshold || val > pre_val) {
                                stage = 3;
                                val = INT_MIN;
                            }
                        }
                        pos++;
                    } else {
                        // other chars, invalid
                        stage = 3;
                    }
                    ;break;
            }
        }
        return val;
    }
};

没有使用大范围的数据类型,溢出需要考虑好,是个小状态机

LeetCode String to Integer (atoi)

标签:style   blog   color   io   os   使用   ar   数据   div   

原文地址:http://www.cnblogs.com/lailailai/p/3982764.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!