8. String to Integer (atoi)

  1. 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.

Solution1:按位转换加权累加,并注意invalid case和溢出

思路:
(1) check non-empty, spaces, signs
(2) for every valid digits from most significant digit to least significant digit:
a. check if next step(3)会乘爆或加爆, if so, sign==+? return MAX_VALUE: MIN_VALUE
b. total = total * 10 + digit;
(3) return sign * total;

Time Complexity: O(str.length())
Space Complexity: O(1)

Solution2: Round1 套路判断overflow

见:http://www.jianshu.com/p/07f7e7a2dd3d

Solution1:

public class Solution {
    public int myAtoi(String str) {

        // 1. ckeck Empty string
        if (str.isEmpty()) return 0;

        // 2. Remove Spaces
        int start = 0;
        while (str.charAt(start) == ' ' && start < str.length()) start++;

        // 3. Handle signs
        int sign = 1; // +1, -1
        if (str.charAt(start) == '-' || str.charAt(start) == '+') {
            sign = str.charAt(start) == '+' ? 1 : -1;
            start++;
        }
        
        // main method
        int total = 0;
        for (int i = start; i < str.length() && str.charAt(i) >= '0' && str.charAt(i) <= '9'; i++) {
            int digit = str.charAt(i) - '0';

            // check if the total will be overflow for next step to exe result = result * 10 + digit;
            if (total > Integer.MAX_VALUE / 10 || (total == Integer.MAX_VALUE / 10 && digit > Integer.MAX_VALUE % 10))
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;

            total = total * 10 + digit;
        }
        return sign * total;
    }
}

Solution2:

class Solution {
    public int myAtoi(String str) {
        if(str.isEmpty() || str.length() == 0) return 0;
        
        // delete space
        int start = 0;
        while(start < str.length() && str.charAt(start) == ' ') start++;
        
        // handle sign
        int sign = 1;
        if(start < str.length() && (str.charAt(start) == '+' || str.charAt(start) == '-')){
            if(str.charAt(start) == '-') {
                sign = -1;
            }
            start++;
        }
        
        int result = 0;
        for(int i = start; i < str.length(); i++) {
            int digit = str.charAt(i) - '0';
            if(digit > 9 || digit < 0) break;

            if(sign > 0 && result > (Integer.MAX_VALUE - digit) / 10) {
                return Integer.MAX_VALUE; 
            }
            else if(sign < 0 && -1 * result < (Integer.MIN_VALUE + digit) / 10) {
                return Integer.MIN_VALUE;
            }
            
            result = result * 10 + digit;
        }
        
        return sign * result;
        
    }
}

你可能感兴趣的:(8. String to Integer (atoi))