题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:输入一个字符串,包括数字字母符号,可以为空
输出描述:如果是合法的数值表达则返回该数字,否则返回0
示例1
输入:+2147483647 输出:2147483647
输入:1a33 输出:0
解题思路
- ask码中,字符’0’最小,字符’9’最大;
- compareTo的原理理解还是不到位,还需要用字符串测试,现在把compareTo的原码贴上来:
原理如下:两个字符串value, anotherString- 以短的字符串为准,如果碰到字符不一致,则返回字符相减的结果;
- 以短的字符串为准,如果字符一致,则返回两个字符串的长度差。
public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
- 首先对字符串进行判空
- 判断输入的字符串是否超过了int可表示对范围,如果超出,直接返回0。
- 遍历字符串中的字符,用字符-'0’得到该字符对十进制数。
代码
public class Solution {
public int StrToInt(String str) {
if(str == null || str.length() == 0) return 0;
if((str.charAt(0) == '-' && str.compareTo("-2147483648") > 0) || str.compareTo("2147483647") > 0) return 0;
int res = 0;
for(int i = 0; i < str.length(); i++){
if(i == 0 && (str.charAt(i) == '-' || str.charAt(i) == '+')){
continue;
} else {
if(str.charAt(i) < '0' || str.charAt(i) > '9'){
return 0;
} else {
res = res * 10 + (str.charAt(i) - '0');
}
}
}
if(str.charAt(0) == '-'){
res = res * (-1);
}
return res;
}
}