很经典的一道面试题
我直接看提示了...
1. leading spaec, 前导空格去掉
2. 之前可能出现一个的+, -符号
3. 若已读到了数值,则数值后出现的多余符号都不管,直接return
4. 若读到的数值越界,则返回INT_MAX(2147483647)或INT_MIN(-2147483648) —— 它们在climits头文件中
5. 输入中没有可转换数值 —— 即可选前导符号后没有数字出现,则无法转换,返回0.
代码:
class Solution { public: int atoi(const char *str) { int ret = 0; bool negative = false; for ( ; strlen(str)>0 && *str==' '; ++ str) {} if (strlen(str) == 0) { return 0; } else if (*str == '+' || *str=='-') { negative = *str=='-'; ++ str; } bool accpect_no_more_digit = false; bool accpect_no_large_digit = false; for ( ; strlen(str)>0 && *str<='9' && *str>='0'; ++ str) { if ( accpect_no_more_digit == true ) { return ret>0? INT_MAX: INT_MIN; } else if (accpect_no_large_digit == true) { if ( ret>0 && *str<='7' ) { ret = 10*ret + *str - '0'; } else if ( ret<0 && *str<='8' ) { ret = 10*ret - (*str - '0'); } else { return ret>0? INT_MAX: INT_MIN; } } else if (negative == false) { ret = 10*ret + *str - '0'; } else { ret = 10*ret - (*str - '0'); } accpect_no_more_digit = ret>INT_MAX/10 || ret<INT_MIN/10; accpect_no_large_digit = ret==INT_MAX/10 || ret==INT_MIN/10; } return ret; } };