String to Integer (atoi)

String to Integer (atoi)

问题:

实现atoi,将字符串转换成整数。
atoi方法首先将任何前置的空格舍弃,直到发现第一个不是空格的字符。然后从这个字符开始,第一个可能是正负号,也可能没有,后面紧跟数字。最后把这个字符串解析成数字。
字符串可能在整数数字后有一些其他的字符,我们需要忽略这些字符,并且这个不影响函数的功能。
如果一开始的非空格字符串不是有效的完整的数字,或者因为str是空或者只包含空格,则转换不会发生。
如果没有有效的转换发生,函数会返回0。如果正确的值超出能表示的数字的范围,则返回最大整数(2147483647)或者最小整数(-2147483648)

解决方案:

这个问题的实质是需要解决溢出。一个非常直接的方法就是将数字存储为字符串,这样我们可以在每一步检验数字是否真的溢出。另外有其他的一些方法可以检验溢出,这样的方法要求知道一些特殊的编程语言或者操作系统如何工作。
一个可行的方案不需要假设知道编程语言如何工作。在每一步我们相乘并且相加来添加一个数字。如果当前的数字大于214748364,我们就知道一定会溢出。另一方面,如果当前的数字等于214748364,则我们知道只有当前位子的数字大于等于8的时候才会溢出。请记住我们还需要考虑最小的数值的边界情况,-2147483648 (-2^31)

private static final int maxDiv10 = Integer.MAX_VALUE / 10;

public int atoi(String str) {
    int i = 0, n = str.length();
    // 从左开始遍历,跳过所有的空格字符
    while (i < n && Character.isWhitespace(str.charAt(i))) i++;
    // 当前默认为正号
    int sign = 1;
    // 如果是正号,则直接向后移,如果是负号,则变成负值
    if (i < n && str.charAt(i) == '+') {
        i++;
    } else if (i < n && str.charAt(i) == '-') {
        sign = -1;
        i++;
    }
    // 设置当前的默认值为0
    int num = 0;
    // 继续往后遍历,并且在每一位是数字的情况下
    while (i < n && Character.isDigit(str.charAt(i))) {
        // 获取当前位的数字
        int digit = Character.getNumericValue(str.charAt(i));
        // 如果当前数字为最大整数的前面所有位数,或者等于前面所有位数,但是当前的数字已经大于8
        if (num > maxDiv10 || num == maxDiv10 && digit >= 8) {
            // 返回最大或者最小整数
            return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
        }
        // 将当前位的数字加在后面
        num = num * 10 + digit;
        i++;
    }
    // 最后返回带签名的数字
    return sign * num;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值