标签: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