首页 > 其他 > 详细

LeetCode String to Integer (atoi)

时间:2014-09-20 01:08:46      阅读:195      评论:0      收藏:0      [点我收藏+]
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)

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!