剑指offer49 把字符串转化为整数


剑指offer49

把字符串转化为整数

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

输入

输入一个字符串,包括数字字母符号,可以为空

输出

如果是合法的数值表达则返回该数字,否则返回0

示例

示例一

输入

“+2147483647”

输出

2147483647

示例二

输入

“1a33”

输出

0

思路

首先判断这个数的正负,如果正数,超过了INT_MAX,就设置为INT_MAX,如果是负数,首先我们不考虑负号,如果超过了INT_MAX+1, 则就置为INT_MAX+1, 最后再根据正负号,来加负号。

边界条件:

  1. 数据上下溢出
  2. 空字符串
  3. 只有正负号
  4. 有无正负号
  5. 错误标志输出

补充:ASCII码

“+” 43, “-“ 45, “0” 48, “A” 65, “a” 97

代码

public class Solution {
    public int StrToInt(String str) {
        if (str == null)
            return 0;
        int result = 0;
        boolean negative = false;//是否负数
        int i = 0, len = str.length();
        /**
         * limit 默认初始化为 负的 最大正整数 ,假如字符串表示的是正数
         * 那么result(在返回之前一直是负数形式)就必须和这个最大正数的负数来比较,
         * 判断是否溢出
         */
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = str.charAt(0);//首先看第一位
            if (firstChar < '0') { // Possible leading "+" or "-", "+" 43, "-" 45, "0" 48
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;//在负号的情况下,判断溢出的值就变成了 整数的 最小负数了
                } else if (firstChar != '+')//首位非正负号和数字,则为非法值
                    return 0;
                if (len == 1) // just have lone "+" or "-",仅有1位
                    return 0;
                i++;
            }
            multmin = limit / 10;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = str.charAt(i++)-'0';//char转int
                if (digit < 0 || digit > 9)//0到9以外的数字,可能包含字母、特殊符号
                    return 0;
                //以负数 multmin 判断溢出,利用limit / 10提前判断是否溢出
                if (result < multmin)
                    return 0;
                result *= 10;    //扩大10倍后,可能越界也可能不越界,需要利用加数 digit(位于0-9之间) 进一步判断
                if (result < limit + digit) {
                    return 0;
                }
                result -= digit;
            }
        } else {
            return 0;
        }
        //如果是正数就返回-result(result一直是负数)
        return negative ? result : -result;
    }
}

/**
边界条件:
1.数据上下溢出
2.空字符串
3.只有正负号
4.有无正负号
5.错误标志输出

补充:ASCII码
"+" 43, "-" 45, "0" 48, "A" 65, "a" 97
*/

文章作者: Hailong Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hailong Gao !
评论
  目录