剑指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();

}

posted @ 2015-05-04 09:03  keedor  阅读(1566)  评论(0编辑  收藏  举报