Saturday, November 22, 2014

[LeetCode] String to Integer (atoi)

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