码迷,mamicode.com
首页 > 编程语言 > 详细

剑指Offer解题报告(Java版)——字符串转换为数字 49

时间:2015-05-04 09:55:08      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

? ?

引言

? ?

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

}

剑指Offer解题报告(Java版)——字符串转换为数字 49

标签:

原文地址:http://www.cnblogs.com/keedor/p/4475346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!