Skip to content

8 String to Integer (atoi) – Easy

Problem:

Implement atoi to convert a string to an integer.

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.

Thoughts:

The tricky part for this problem is how to handle overflow. The annoying thing here is the special cases. “010” -> 10 “+-2″ -> 0 ” 010″ -> 10 “-012ab1234” -> -12 “2147483648” -> “2147483647” “-2147483648” -> – 2147483648 Although I would think for some of these special cases we should throw Exceptions instead of returning things.

Solutions:

public class Solution {
    public int myAtoi(String str) {
        str = str.trim();
        int result = 0;
        int flag = 1;
        int start = 0;
        if (str == null || str.length() == 0){
            return 0;
        }
        if (str.charAt(0) == '-'){
            flag = -1;
            start = 1;
        }
        else if (str.charAt(0) == '+'){
            start = 1;
        }
        for (int i = start; i < str.length(); i ++){
            if (str.charAt(i) != '0'){
                start = i;
                break;
            }
        }
        for (int i = start; i < str.length(); i ++){
            char c = str.charAt(i);
            if (c < 48 || c > 57){
                break;
            }
            int digit = c - 48;
            int tmp = result * 10 + digit;
            if (tmp == Integer.MIN_VALUE && i == (str.length() -1) && str.charAt(0) == '-'){
                return Integer.MIN_VALUE;
            }
            else if ((tmp - digit) / 10 != result || (result > 0 && tmp < 0)){
                //overflow
                if (str.charAt(0) == '-'){
                    return Integer.MIN_VALUE;
                }
                else{
                    return Integer.MAX_VALUE;
                }
            }
            else{
                result = tmp;
            }
        }
        return result * flag;
    }
}
Updated: 10/17/2016

public class Solution {
    public int myAtoi(String str) {
        str = str.trim();
        if (str.length() == 0){
            return 0;
        }
        int i = 0, flag = 1, plus = 0, minus = 0;
        long result = 0;
        if (str.charAt(0) == '-') {
            flag = -1;
            i = 1;
        }
        else if (str.charAt(0) == '+') {
            i = 1;
        }
        while (i < str.length()) {
            if (str.charAt(i) >= '0' && str.charAt(i) <= '9') {
                int digit = str.charAt(i) - '0';
                result = result * 10 + digit;
                if (result > Integer.MAX_VALUE) {
                    break;
                }
            }
            else {
                break;
            }
            i ++;
        }
        if (result*flag > Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        }
        if (result*flag < Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }
        return (int) result*flag;
    }
}