8. String to Integer (atoi) 「字符串转换整数」

实现字符串转换整数的函数 atoi

这个函数首先丢弃一些必要的空白字符,直到第一个非空字符的出现。然后,从这个非空字符开始,选择一个可选的初始正负号,后面跟着尽可能多的数字,把它们解读成数字。

字符串中在数字之后可以包含额外的字符,在函数处理过程中应当被忽略并且不会产生影响。

如果字符串中的非空白字符的第一个序列不是有效的整数,或者因为字符串为空或仅包含空白字符而没有这样的序列,则不执行任何转换。

如果无法执行有效的转换,则返回零值。

提示:
1. 只有空格 ' ' 才算作空白字符。
2. 假设函数运行的环境只能存储 32 位有符号整数,取值范围为 [-231, 231-1]。如果数字的大小超过了这个可表示的范围,则返回 INT_MAX (231 − 1) 或者 INT_MIN (−231)。

例一:
输入: “42”
输出: 42

例二:
输入: ” -42″
输出: -42
解释: 第一个非空字符是“-”,是负号。然后尽可能多的读取数字,得到 42。

例三:
输入: “4193 with words”
输出: 4193
解释: 在读取数字 3 之后停止转换,因为接下来的字符不是数字。

例四:
输入: “words and 987”
输出: 0
解释: 第一个非空字符是 w,并不是一个数字或者正负号。因此无法进行转换。

例五:
输入: “-91283472332”
输出: -2147483648
解释: -91283472332 超出了 32 位有符号整数可以表示的范围。因此返回 INT_MIN (−231)。

/*
 * 8. String to Integer (atoi)
 * https://leetcode.com/problems/string-to-integer-atoi/
 * https://www.whosneo.com/8-string-to-integer-atoi/
 */

class MyAtoi {
    public static void main(String[] args) {
        MyAtoi solution = new MyAtoi();

        System.out.println(solution.myAtoi("255"));
        System.out.println(solution.myAtoi("    -255"));
        System.out.println(solution.myAtoi("4193 with words"));
        System.out.println(solution.myAtoi("words and 987"));
        System.out.println(solution.myAtoi("-91283472332"));
    }

    private int myAtoi(String str) {
        char[] value = str.toCharArray();
        int length = str.length();
        int sign = 1;
        long result = 0;
        int i = 0;

        while (i < length && value[i] == ' ') { //忽略开头的空格
            i++;
        }

        if (i < length && (value[i] == '-' || value[i] == '+')) { //忽略正负号,且只能出现一次
            if (value[i] == '-') sign = -1;
            i++;
        }

        if (i < length && (value[i] < 48 || value[i] > 57)) { //若开头不是数字,直接结束
            return 0;
        }

        while (i < length && value[i] >= 48 && value[i] <= 57) {
            result = result * 10 + (value[i] - 48);
            i++;
            if (result > Integer.MAX_VALUE) { //当数字过大时,没有必要继续计算
                if (sign == 1) return Integer.MAX_VALUE;
                else return Integer.MIN_VALUE;
            }
        }

        result *= sign;

        return (int) result;
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注