剑指offer49
把字符串转化为整数
题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入
输入一个字符串,包括数字字母符号,可以为空
输出
如果是合法的数值表达则返回该数字,否则返回0
示例
示例一
输入
“+2147483647”
输出
2147483647
示例二
输入
“1a33”
输出
0
思路
首先判断这个数的正负,如果正数,超过了INT_MAX,就设置为INT_MAX,如果是负数,首先我们不考虑负号,如果超过了INT_MAX+1, 则就置为INT_MAX+1, 最后再根据正负号,来加负号。
边界条件:
- 数据上下溢出
- 空字符串
- 只有正负号
- 有无正负号
- 错误标志输出
补充: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
*/