字符串转数字,这是个很有趣的题目。下面是我的解答,改了好几遍才通过。
class Solution {
public static int myAtoi(String str) {
//如果该字符串第一个字符非有效整数字符、串为空、仅包含空白 返回0
if(str.isEmpty()) return 0;
if(str.indexOf(".")!=-1) {
if(str.indexOf(".")==0)return 0;
str=str.substring(0, str.indexOf("."));
}
str=str.trim();
char[] charArray = str.toCharArray();
//转换
int strlength = str.length();
if(strlength==0)return 0;
int point=0;
int sign =-1;
//开存储空间
StringBuilder sbu = new StringBuilder(str.length());
//判断第一位是否为为数符,且不是小数点
if(isPlusOrMinusSign(charArray[point])||isNumber(charArray[point])){
//若第一位位数符,则置标志位为0
if(isPlusOrMinusSign(charArray[point])==true) sign=0;
sbu.append(charArray[point++]);
}else {
return 0;
}
//获取有效值
while(point<strlength&&isNumber(charArray[point])) {
sbu.append(charArray[point]);
point++;
}
if(sign==0)while(sbu.indexOf("0")==1) sbu.deleteCharAt(sbu.indexOf("0"));
else while(sbu.indexOf("0")==0) sbu.deleteCharAt(sbu.indexOf("0"));
if(sbu.length()==0)return 0;
//delete(sbu.indexOf("0"));
if(sbu.length()>11) {
if(sbu.charAt(0) == 45) {
return -2147483648;
}
return 2147483647;
}
if(sbu.length()==1&&sign==0) {
return 0;
}
long info = 0;
info = Long.parseLong(sbu.toString());
if(info > 2147483647) {
return 2147483647;
}
if(info < -2147483648) {
return -2147483648;
}
return (int)info;
//如果转换后的结果越界 返回0 | 2147 4836 47 -2147 4836 48
}
public static boolean isNumber(char info) {
return info>=48&&info<=57;
}
public static boolean isPlusOrMinusSign(char info) {
if(info==43||info==45) {
return true;
}
return false;
}
}
可以参考看看,效率不高。