您的位置:首页 > Web前端

剑指offer——字符串转数字(奥妙各种)(没有考虑科学计数法的情况)(好题)

2017-07-01 15:15 239 查看
题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

+2147483647

1a33

输出

2147483647

0

思路:

把String变成charArray,然后挨个对char元素分解,并判断是否是正确的数字。除了正负号和数字以外的所有字符,如果检测到直接break , 正负号没有出现在0号位,也是错误字符串。

?最高位是0,但前面有个加号或者减号,算是正确表达么?

加号的ascii码是43,减号是45

public class Solution {
public int StrToInt(String str) {
char[] s = str.toCharArray();
int result = 0;
if(s.length==0)
return 0;
int i = s.length-1;
for(; i>=1; i--){
if((s[i]-'0')>=0&&(s[i]-'0')<=9)
result += (int)Math.pow(10,s.length-(i+1))*(s[i]-'0');
else
break;
}
if(i>1)
return 0;
if((s[i]-'0')>0&&(s[i]-'0')<=9){
result += (int)Math.pow(10,s.length-1)*(s[0]-'0');
return result;
}
else if((s[i]-'0')==0&&s.length==1)
return 0;
else if(s[i]==45) // 直接s[i] = '-' 就好了...
return result*-1;
else if(s[i]==43)
return result;
return 0;
}
}


虽然过了OJ,但是有没考虑到的情况,比如整数类型可能会溢出。

溢出时,正负号会改变,以此判断溢出。

if((s[i]-'0')>=0&&(s[i]-'0')<=9) {
int temp = (int) Math.pow(10, s.length - (i + 1)) * (s[i] - '0') + result;
if(temp*result<0) //说明溢出了
return 0;
else
result = temp;
}


用下面的方法求和也可以!

for (int i = start; i < chars.length; i++) {
result = result * 10 + (int) (chars[i] - '0');
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐