[leetcode]String to Integer (atoi)

水题。需要注意的是特殊情况考虑。一是前面的空格,二是最后的非数字字符,三是正负符号(我考虑了负号,忘记了正号),四是溢出,而且溢出还分两种,一是2147483649这样的溢出,二是10000000000这样的溢出,多一位(我只考虑了一种)。五是空字符串。最终代码pass,但其实还忘了处理null。

代码如下:

public class Solution {
    public int atoi(String str) {
        // Start typing your Java solution below
        // DO NOT write main() function
        int ans = 0;
        int i = 0;
        boolean neg = false;
        boolean overflow = false;
        int len = str.length();
        
        while (i < len && str.charAt(i) == ' ') i ++;
        // the first char
        if (i < len && str.charAt(i) == '-')
        {
        	neg = true;
        	i++;
        }
        if (i < len && str.charAt(i) == '+')
        {
        	neg = false;
        	i++;
        }
        while (i < len && str.charAt(i) >= '0' && str.charAt(i) <= '9')
        {
        	int d = str.charAt(i) - '0';
        	if (ans >= 214748364)
        	{
        		if ((!neg && d >= 7) || neg && d >= 8 || (ans >= 1000000000))
        		{
        			overflow = true;
        			break;
        		}
        	}
        	ans = ans * 10 + d;
        	i++;
        }
        if (overflow)        	
        {
        	if (!neg) return Integer.MAX_VALUE;
        	else return Integer.MIN_VALUE;
        }
        if (neg) return ans * (-1);
        else return ans;
    }
}

另外对溢出的判断还可以用类似下面的代码:

if (INT_MAX / 10 >= ret)
     ret *= 10;
else
     return sign == -1 ? INT_MIN : INT_MAX;
      
if (INT_MAX - digit >= ret)
     ret += digit;
else
     return sign == -1 ? INT_MIN : INT_MAX;

  

posted @ 2013-07-26 05:52  阿牧遥  阅读(863)  评论(0编辑  收藏  举报