题目描述
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。
数值为0或者字符串不是一个合法的数值则返回0。输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0。
知识点:
在ASCLL码中字符‘0’ 对应的编码是 48(十进制),依次’1’对应49,‘1’ ~ ‘9’对应48 ~ 57,但是整数1就是等于1。‘1’ – ‘0’ = 1,可以看做49 -48 =1;同理‘7’ – ‘0’ =7 ,对应 58 -49
= 7;
疑问: 为什么返回的是整型 不是字符?
自己的思路: 要明白在ASCLL码表中’1’对应的是二进制,对应的二进制转对应十进制是49,‘-’
这个操作是字符的二进制编码的相减,结果为二进制(计算机是以二进制进行存储),注意结果为二进制0000
0001就是十进制1,此时1是整型而不是字符(与ASCLL码已经无关了)
编程注意事项
编程过程最重要就是注意边界划分
依次遍历并截取字符串,只要截取字符相减‘0’大于9(整数),字符就不是数字(ASCLL码小于48的字符相减小于0,当然小于9),然后乘于10的n次方,结果相加。
字符串“123”依次读取的‘1’,‘2’,3,1 * 100+ 2 *10 + 3 *1(10的0次方)
为了方便边界划分我是从后向前遍历的。
所以获取的最后一个为“+” 或“-”(如果有“+”和 “-”),判断为‘+’ 直接返回结果num。(此时不会对 ‘+’ 进行操作’),’-‘直接返回-num
代码
public int StrToInt(String str) {
int num = 0;
int n = 0;
for (int i = str.length() - 1; i >= 0; i--) {
char c = str.charAt(i);
if ((c - '0') > 9) {
return 0;
}
if(c == '+'){
return num;
}
if(c == '-'){
return -num;
}
num = num + (c - '0') * (int) Math.pow(10, n);
n ++;
}
return num;
}