All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0001_0100.s0008_string_to_integer_atoi.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0001_0100.s0008_string_to_integer_atoi;

// #Medium #Top_Interview_Questions #String #2023_08_09_Time_1_ms_(100.00%)_Space_41_MB_(98.97%)

/**
 * 8 - String to Integer (atoi)\.
 *
 * Medium
 *
 * Implement the `myAtoi(string s)` function, which converts a string to a 32-bit signed integer (similar to C/C++'s `atoi` function).
 *
 * The algorithm for `myAtoi(string s)` is as follows:
 *
 * 1.  Read in and ignore any leading whitespace.
 * 2.  Check if the next character (if not already at the end of the string) is `'-'` or `'+'`. Read this character in if it is either. This determines if the final result is negative or positive respectively. Assume the result is positive if neither is present.
 * 3.  Read in next the characters until the next non-digit character or the end of the input is reached. The rest of the string is ignored.
 * 4.  Convert these digits into an integer (i.e. `"123" -> 123`, `"0032" -> 32`). If no digits were read, then the integer is `0`. Change the sign as necessary (from step 2).
 * 5.  If the integer is out of the 32-bit signed integer range [-231, 231 - 1], then clamp the integer so that it remains in the range. Specifically, integers less than -231 should be clamped to -231, and integers greater than 231 - 1 should be clamped to 231 - 1.
 * 6.  Return the integer as the final result.
 *
 * **Note:**
 *
 * *   Only the space character `' '` is considered a whitespace character.
 * *   **Do not ignore** any characters other than the leading whitespace or the rest of the string after the digits.
 *
 * **Example 1:**
 *
 * **Input:** s = "42"
 *
 * **Output:** 42
 *
 * **Explanation:** The underlined characters are what is read in, the caret is the current reader position.
 *
 *     Step 1: "42" (no characters read because there is no leading whitespace)
 *              ^ 
 *     Step 2: "42" (no characters read because there is neither a '-' nor '+')
 *              ^
 *     Step 3: "42" ("42" is read in)
 *                ^
 *
 * The parsed integer is 42. Since 42 is in the range [-231, 231 - 1], the final result is 42. 
 *
 * **Example 2:**
 *
 * **Input:** s = " -42"
 *
 * **Output:** -42
 *
 * **Explanation:**
 *
 *     Step 1: " -42" (leading whitespace is read and ignored)
 *               ^ 
 *     Step 2: " -42" ('-' is read, so the result should be negative)
 *                ^
 *     Step 3: " -42" ("42" is read in)
 *                  ^
 *     The parsed integer is -42.
 *
 * Since -42 is in the range [-231, 231 - 1], the final result is -42. 
 *
 * **Example 3:**
 *
 * **Input:** s = "4193 with words"
 *
 * **Output:** 4193
 *
 * **Explanation:**
 *
 *     Step 1: "4193 with words" (no characters read because there is no leading whitespace)
 *              ^
 *     Step 2: "4193 with words" (no characters read because there is neither a '-' nor '+')
 *              ^
 *     Step 3: "4193 with words" ("4193" is read in; reading stops because the next character is a non-digit)
 *                  ^ 
 *     The parsed integer is 4193.
 *
 * Since 4193 is in the range [-231, 231 - 1], the final result is 4193. 
 *
 * **Example 4:**
 *
 * **Input:** s = "words and 987"
 *
 * **Output:** 0
 *
 * **Explanation:**
 *
 *     Step 1: "words and 987" (no characters read because there is no leading whitespace)
 *              ^
 *     Step 2: "words and 987" (no characters read because there is neither a '-' nor '+')
 *              ^
 *     Step 3: "words and 987" (reading stops immediately because there is a non-digit 'w')
 *              ^
 *     The parsed integer is 0 because no digits were read.
 *
 * Since 0 is in the range [-231, 231 - 1], the final result is 0. 
 *
 * **Example 5:**
 *
 * **Input:** s = "-91283472332"
 *
 * **Output:** -2147483648
 *
 * **Explanation:**
 *
 *     Step 1: "-91283472332" (no characters read because there is no leading whitespace)
 *             ^
 *     Step 2: "-91283472332" ('-' is read, so the result should be negative)
 *               ^
 *     Step 3: "-91283472332" ("91283472332" is read in)
 *                          ^
 *     The parsed integer is -91283472332.
 *
 * Since -91283472332 is less than the lower bound of the range [-231, 231 - 1], the final result is clamped to -231 = -2147483648.  
 *
 * **Constraints:**
 *
 * *   `0 <= s.length <= 200`
 * *   `s` consists of English letters (lower-case and upper-case), digits (`0-9`), `' '`, `'+'`, `'-'`, and `'.'`.
**/
public class Solution {
    public int myAtoi(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        int i = 0;
        boolean negetiveSign = false;
        char[] input = str.toCharArray();
        while (i < input.length && input[i] == ' ') {
            i++;
        }
        if (i == input.length) {
            return 0;
        } else if (input[i] == '+') {
            i++;
        } else if (input[i] == '-') {
            i++;
            negetiveSign = true;
        }
        int num = 0;
        while (i < input.length && input[i] <= '9' && input[i] >= '0') {
            // current char
            int tem = input[i] - '0';
            tem = negetiveSign ? -tem : tem;
            // avoid invalid number like 038
            if (num == 0 && tem == '0') {
                i++;
            } else if (num == Integer.MIN_VALUE / 10 && tem <= -8 || num < Integer.MIN_VALUE / 10) {
                return Integer.MIN_VALUE;
            } else if (num == Integer.MAX_VALUE / 10 && tem >= 7 || num > Integer.MAX_VALUE / 10) {
                return Integer.MAX_VALUE;
            } else {
                num = num * 10 + tem;
                i++;
            }
        }
        return num;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy