题目描述
- 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述
输入一个字符串,包括数字字母符号,可以为空
输出描述
如果是合法的数值表达则返回该数字,否则返回0
示例输入
+2147483647
1a33
示例输出
2147483647
0
题目分析
- 首先我们需要判断字符串首位的符号,第一位可能是+也可能是-也可能没有(默认的是正数),那么需要一个布尔变量作为符号的判断
- 假设我们的符号判断的布尔值为true那么设置一个factor表示其乘积因子为1, 否则设置为-1,作为后面累加字符串数据使用
- 从判断符号之后的索引开始遍历执行,while循环执行即可,必须满足index下标小于字符串长度,并且对应的字符在0-9之间,此时则可以进行result = result*10+factor*(str.charAt(i)-'0')进行累加计算得到结果
- 累加计算后需要判断是否溢出,溢出的判断采用声明高一级的数据,用于结果和Integer.MAX_VALUE和Integer.MIN_VALUE进行比较即可,超过这个值表示溢出那么返回0。
- 如果在循环结束后正常情况下,下标索引==字符串长度,如果不等于那么说明中间有别的字符,直接返回0。否则就返回我们得到的结果需要转换为int
需要注意的点
- 关于字符串转换表达式result = result*10+factor*(str.charAt(i)-'0')
- 判断输入的字符串下界情况,即字符串为空或者字符串指向null
- 字符串非法输入(遍历无法完整结束)
- 结果溢出(声明更大的类型变量进行存储进行溢出判断)
Java代码
public class Solution {
public int StrToInt(String str) {
if(str==null || str.length()==0) return 0;
boolean flag = true;//符号位,true表示正数,false表示负数
int index = 0;//字符串下标索引
if (str.charAt(index) == '+') {
index++;
flag = true;
}
else if (str.charAt(index) == '-') {
flag = false;
index++;
}
int result = 0;
if (index != str.length()) result = stringToInt(str, index, flag);
return result;
}
private static int stringToInt(String str, int index, boolean flag) {
int factor = flag? 1 : -1;
long result = 0;
while (index < str.length() && str.charAt(index)>='0' && str.charAt(index)<='9') {
result = result*10 + factor*(str.charAt(index)-'0');
if (result>Integer.MAX_VALUE|| result<Integer.MIN_VALUE) {
return 0;
}
index++;
}
if (index==str.length()) return (int)result;
return 0;
}
}
网友评论