题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647 1a33
输出
2147483647 0
思路:
这个题本身不难,就是字符串转数值,从前到后一个一个遍历就好了。难的是处理各种异常case:
- 字符串为空
- 字符串为“0”
- 首位是“+”or“-”
- 首位是“+”“-”“0-9”以外的字符
- 数值的上下溢出(Java中最大正整数是2147483647,最大负整数是-2147483648)
public class Solution {
public int StrToInt(String str) {
int fuhao = 0; //标示首位是否是符号位
int target = 0; //标示这个数最终是正还是负数,这里初始化为0,是因为下面判断要用到。如果初始化为-1的话,下面判断上溢出,是进不去条件的
long value = 0;
if(str.length() == 0 || str.equals("")){
return 0;
}
if(str.charAt(0) == '+'){
fuhao = 1;
target = 0;
}else if(str.charAt(0) == '-'){
fuhao = 1;
target = 1;
}else if(str.charAt(0) < '0' && str.charAt(0) > '9'){ //第一位就是非法字符的话,直接返回0
return 0;
}
for(int i = fuhao; i < str.length(); i ++){
if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){
value = value * 10 + (str.charAt(i) - '0');
if(target == 0 && value > Integer.MAX_VALUE){ //上溢出
return 0;
}
if(target == 1 && (-1)*value < Integer.MIN_VALUE){ //下溢出,value前面一定要加(-1),因为是和负数做比较
return 0;
}
}else{
return 0; //非法字符
}
}
if(target == 1)
return (int) (-1 * value);
else
return (int) value;
}
}