剑指Offer解题报告(Java版)——字符串转换为数字 49
引言
STOI是很常见的一道题,leetcode上也有,字符串转换为数字一般都会有现成的函数去实现这样的功能,但有时候需要我们理解其中的具体实现,因为虽然是个很常见的问题,但实际上需要考虑的问题还是很多的,尤其是corner case的处理,而这类问题一般要考虑两点:一点是符号,另外一点是越界
分析问题
如果字符串前面有空格怎么办,一般来说中间是没有空格的,但是前后可能有空格,所以我们首先需要去掉多余的空格字符,用到trim函数
然后就是字符串中有可能第一个位置上有符号,比如负号,对于正数,有可能有,有可能没有,这种问题应该怎么去解决呢,其实如果有符号的话也肯定是在第一个字符处,所以我们只要判断一下第一个字符是不是负号,如果是,我们需要勇哥标志标记一下,如果不是负号而是正号,那么直接跳过就行,如果没有符号,那么从第一个数开始读取
另外就是有可能前面的字符串都是乖乖的是数字,中间来个异常字符,那么我们这个时候需要做的就要分情况了,第一我们可以保留前面的数字,舍弃异常字符后面的东西,第二就是我们直接简单粗暴的返回错误
还有就是字符串表示的数字有可能很大,有可能越界,那么我们应该怎么办,可以输出,越界了,也可以返回最接近的整数
另外用个boolean值表示是否正常完成,而对于一些异常的处理,可以因人而异,因要求而异了
解决问题
static boolean finished = false;
public int atoi(String str) {
str=str.trim();
int i = 0;
boolean minus = false;
if (str.charAt(0) == '-') {
minus = true;
i++;
} else if (str.charAt(0) == '+') {
i++;
}
long MIN_VALUE = Integer.MIN_VALUE;
long MAX_VALUE = Integer.MAX_VALUE;
long num = 0;
for (; i < length && !finished; i++) {
char c = str.charAt(i);
if (c >= '0' && c <= '9') {
num *= 10;
num += c - '0';
} else {
num=0;
break;
}
if (minus && 0 - num < MIN_VALUE) {
return Integer.MIN_VALUE;
}
if (!minus && num > MAX_VALUE) {
return Integer.MAX_VALUE;
}
}
if (i==length) {
finished = true;
}
return minus ? new Long(0 - num).intValue() : new Long(num).intValue();
}