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.

原问题链接:https://leetcode.com/problems/string-to-integer-atoi/ 

问题分析

    相对比较简单的问题,将字符串转换成对应的整数。针对这个问题有一些情况需要考虑,很容易在实现的时候有遗漏。典型的来说有这么几种情况:

    1. 字符串开头有显示正负符号"+" "-" ,这种情况下对首字母要判断。

    2. 字符串开头结尾有空白字符,要将这些去掉。

    3. 字符串中间有非数字的符号。对于这种情况有值得商榷的地方。一种是返回一个目前能解析到的值,一种也可以是报错。

    4. 还有就是解析的数字太大,导致数字溢出了。比如大于或者整数所能表示的最大最小值,这个时候就返回对应的最大最小值就可以了。防止整数表示溢出,也可以采用类似的策略,用一个long类型来保存解析的结果。然后在一边解析的时候一边判断是否溢出。

    按照这个思路,可以得到如下的代码:

public class Solution {
    public int myAtoi(String str) {
        if(str == null || str.length() == 0) return 0;
        str = str.trim();
        char c = str.charAt(0);
        int flag = 1, start = 0;
        long result = 0;
        if(c == '-') {
            flag = -1;
            start++;
        } else if(c == '+') {
            start++;
        }
        for(int i = start; i < str.length(); i++) {
            char ch = str.charAt(i);
            if(!Character.isDigit(ch)) break;
            result = result * 10 + ch - '0';
            if(flag == 1 && result >= Integer.MAX_VALUE) return Integer.MAX_VALUE;
            if(flag == -1 && result * flag <= Integer.MIN_VALUE) return Integer.MIN_VALUE;
        }
        return (int)result * flag;
    }
}

总结

    这个问题在很多的面试情况下有问到。一个是它看起来并不复杂,几乎每个人都能想到一点思路。但是里面要考虑的细节比较多,很容易遗漏。所以对细节的全面考虑还是很重要的。 

猜你喜欢

转载自shmilyaw-hotmail-com.iteye.com/blog/2282445