leetcode
leetcode 2601 ~ 2650
把字符串转换成整数 (atoi)

把字符串转换成整数 (atoi)

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 44 ms, 内存: 14.8 MB


/*
 * Approach using Java Streams:
 * 1. Discard leading whitespace characters.
 * 2. Use Streams to process the string and convert to integer.
 * 3. Handle sign and overflow conditions.
 */
import java.util.stream.IntStream;

public class SolutionStream {
    public int myAtoi(String s) {
        int[] result = {0}; // Using an array to capture result inside lambda
        int[] sign = {1};
        boolean[] started = {false};
        // Using Streams to iterate characters
        IntStream.range(0, s.length()).forEach(i -> {
            char c = s.charAt(i);
            if (!started[0] && c == ' ') return;
            if (!started[0] && (c == '+' || c == '-')) {
                sign[0] = c == '-' ? -1 : 1;
                started[0] = true;
                return;
            }
            if (Character.isDigit(c)) {
                started[0] = true;
                int digit = c - '0';
                if (result[0] > (Integer.MAX_VALUE - digit) / 10) {
                    result[0] = sign[0] == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
                    return;
                }
                result[0] = result[0] * 10 + digit;
            } else if (started[0]) {
                return;
            }
        });
        return result[0] * sign[0];
    }
}

解释

方法:

该题解首先使用strip()去除字符串s的前导和后续空格。若处理后的字符串为空,则直接返回0。接下来,判断字符串首字符是否为正负号,以确定结果的符号并设置起始索引。然后,初始化结果变量res为0,并设置一个界限值boundary,用于判断结果是否溢出。遍历字符串中的字符,如果字符是数字,则计算其整数值并更新结果res;如果遇到非数字字符或者结果溢出,则停止遍历。最后,根据符号变量sign调整res的符号,并返回最终结果。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在`myAtoi`函数中,你是如何确定何时停止读取数字,并处理非数字字符的?
在`myAtoi`函数中,我们通过在循环内部检查每个字符是否属于'0'到'9'的范围来决定何时停止读取数字。如果遇到一个字符不在这个范围内,循环将会中断,因此后续的字符将不会被进一步处理或转换成数字。这种方式确保了只有连续的数字字符会被转换,一旦遇到第一个非数字字符,转换过程即停止。
🦆
函数中使用`strip()`来移除字符串的前导和后续空格,但如果输入字符串含有中间空格怎么处理?
函数使用`strip()`仅移除字符串开头和结尾的空格。如果字符串中间包含空格,那么在数字读取过程中一旦遇到这些空格,读取将会停止。例如,对于字符串`'123 456'`,函数只会识别出`123`,而在遇到第一个中间空格时停止读取。这意味着中间空格会被视为非数字字符,从而终止数字的进一步解析。
🦆
在处理数字溢出时,你设置的边界值`boundary`为`(2**31-1) // 10`,能具体解释为什么选择这个值作为边界吗?
这个边界值`boundary`是为了确保在进行数字转换时不会超过32位整数的最大值2147483647(对于正数)或最小值-2147483648(对于负数)。通过设置`boundary`为214748364(即`(2**31-1) // 10`),我们在每次迭代中检查`res`变量是否大于或等于这个边界值。如果`res`已接近边界值,再加上一个大于7的数字会导致溢出(因为2147483647的最后一位是7)。这种预先设定的边界检查方法可以有效防止溢出,同时简化代码逻辑。
🦆
在判断字符是否为数字时,代码使用`'0' <= c <= '9'`进行判断,这种方法是否可靠,存在哪些潜在的问题或局限性?
使用`'0' <= c <= '9'`来判断字符是否为数字是一种非常直接且有效的方法,适用于所有基于ASCII编码的环境。这种方法的局限性主要在于它仅适用于ASCII字符集中的数字。对于其他语言或编码系统(如Unicode中的全角数字等),这种方法可能无效。此外,这种方法假设输入是合法的ASCII字符,对于非法字符或二进制数据,此方法可能不适用。

相关问题