Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
细节实现题,这种题主要考察corner case是否都考虑全了,需要和面试官多交流。这里需要考虑的有:
1. 起始空格、非数字字符。
2. 正负号。
3. 0为数字中的最高位
4. overflow/underflow
5. 末尾非数字字符
根据以上枚举的特殊情况,判断的流程如下:
0. 用一个unsigned long long ret来记录结果,用bool isNeg记录正负。
1. 跳过所有起始空格,找到第一个非空格字符c0
(a) c0非数字字符(包括\0)也非正负号,返回0。
(b) c0为+或-,若下一个字符c1为数字,用isNeg记录下正或负,并移到c1。否则返回0。
(c) c0为数字,则更新ret
2. 经过1已经找到了第一个数字字符,以及结果的正负。此时只需要逐个扫描后面的数字字符,并更新ret即可。终止的条件有以下几个:
(a) 扫到一个非数字字符,包括\0和空格。返回ret
(b) ret已经超出int的范围,返回相应的INT_MIN/INT_MAX
这几条都想清楚后,代码写起来就不容易错了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Solution { public: int atoi(const char *str) { bool isNeg = false; unsigned long long ret = 0; // skip leading white spaces while(*str==' ') str++; // first none white space char must be +- or digit if(!isdigit(*str) && *str!='+' && *str!='-') return 0; // for +-, next char must be digit if(*str=='+' || *str=='-') { if(!isdigit(*(str+1))) return 0; if(*str=='-') isNeg = true; str++; } while(isdigit(*str)) { ret = ret*10 + (*str - '0'); if(ret>(unsigned long long)INT_MAX) return isNeg ? INT_MIN : INT_MAX; str++; } return isNeg ? -(int)ret : (int) ret; } }; |
No comments:
Post a Comment