剑指offer(52):字符串转为数字

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。

分析

该题最重要的就是各种边界条件的判定,保持代码的健壮性。需要考虑的条件包括:

  1. 输入的字符串为空串或者为空指针,返回0。
  2. 输入的字符串包含除“+”、“-”、0~9数字之外的其他非法字符,返回0。
  3. 输入的字符串包含多个“+”、“-”,返回0。
  4. 输入的字符串长度为1,并且仅仅包含“+”或者“-”,返回0。
  5. 转化的数字超过int的下限或者上限,发生溢出,返回0。

此处只要参考了JDK源码中的部分,Integer.parstInt(String str)函数,关于该函数源码的具体大数溢出问题的说明,可以参见文章计算机原码、反码、补码详解中“大数溢出问题”的部分。

牛客AC:

public class Solution {
    public int StrToInt(String str) {
        if (str == null || str.length() <= 0)
            return 0;

        int result = 0;
        int limit = -Integer.MAX_VALUE; // 对上限取反不会发生溢出
        boolean isNegetive = false;
        int length = str.length();
        int index = 0;

        char firstChar = str.charAt(0);
        if (firstChar < '0') {
            if (firstChar == '-') {
                isNegetive = true;
                limit = Integer.MIN_VALUE;
            } else if (firstChar != '+') 
                return 0;

            if (length == 1) 
                return 0;

            index++;
        }

        while (index < length) {
            char c = str.charAt(index);
            int digit = c - '0';

            if (digit < 0 || digit > 9) 
                return 0;

            // 除以10必须放在不等式右侧防止左侧溢出
            // 如果满足条件,说明 result*10不会发生溢出
            if (result < limit / 10)
                return 0;

            result *= 10;

            // digit必须放在不等式右侧防止左侧溢出,判断防止最终溢出
            // 如果满足条件说明 result-digit不会发生溢出
            if (result < limit + digit) 
                return 0;

            // 当成负数累减
            result -= digit;
            index++;
        }

        return isNegetive ? result : -result;
    }
}

你可能感兴趣的:(剑指offer,字符串转为数字)