题目描述
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647
1a33
输出
2147483647
0
相关知识点:
在ASCLL码中字符‘0’ 对应的编码是 48(十进制),依次’1’对应49,‘1’ ~ ‘9’对应49 ~ 57,但是整数1就是等于1。
‘1’ - ‘0’ = 1,可以看做49 -48 =1;
同理‘7’ - ‘0’ =7 ,对应 58 -49= 7;
疑问: 为什么返回的是整型 不是字符?
要明白在ASCLL码表中’1’对应的是二进制,对应的二进制转对应十进制是49,‘-’这个操作是字符的二进制编码的相减,结果为二进制(计算机是以二进制进行存储),注意结果为二进制00000001就是十进制1,此时1是整型而不是字符(与ASCLL码已经无关了)
解题思路:
1.先判断第一位是不是符号位,如果有符号,有flag 做标记。
2.遍历字符串中的每个字符,如果存在非数字的字符,直接返回 0,否则,用当前字符减去’0’得到当前的数字,再进行运算。
if(str.length() == 0)
return 0;
int flag = 0;//判断符号
if(str.charAt(0) == '+')
flag = 1;
else if(str.charAt(0) == '-')
flag = 2;
int start = flag > 0 ? 1 : 0;
long res = 0;
while(start < str.length()) {
if(str.charAt(start) > '9' || str.charAt(start) < '0')
return 0;
res = res * 10 + (str.charAt(start) - '0');
start++;
}
return flag == 2? -(int)res : (int)res;