Lintcode 54 转换字符串到整数
实现atoi这个函数,将一个字符串转换为整数。如果没有合法的整数,返回0。如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-2147483648)如果是负整数。
解题思路:这题需要考虑周全,数字和字符的情况很多
1.获取字符串
(1)当首位时,除去空格后判断首位是否为数字或“+”,“-”号,如果是继续,否则返回0;
(2)当不是首位时,判断是否有小数点,如果有小数点,判断小数点左右两端是否是数字,
如果是,继续,否则返回0;
(2.1)当遇到非数字时,且这个非数字不是小数点,如果这个非数字前面的字符还是非数字,返回0,否则跳出循环。
2.字符串处理
(1)截取返回的字符串
(2)当字符串首位没有符号时,对字符串循环读取。
①当读取的字符是数字时
②如果当前访问的字符串长度小于10,访问的数+之前访问的数X10
③否则,判断前9位是否大于214748364,如果大于,直接返回2147483647,如果等
于214748364,判断当前访问的字符是否大于7,大于7直接返回2147483647
④当读取的数不是数字时,返回这个字符之前的字符转换后的数字
(3)当字符串首位有符号时,从下标1开始循环读
①当读取的字符是数字时
②如果当前访问的字符串长度小于11,访问的数+之前访问的数X10
③否则,判断前9位(出去符号)是否大于214748364,如果大于,直接返回2147483647,
如果等于214748364,判断字符串首位是否是“-”,如果是,判断当前访问的字符是否大于8
,大于8直接返回-2147483648;如果首位是“+”,判断当前访问的字符是否大于7,如果是
,直接返回2147483647。
④当读取的数不是数字时,返回这个字符之前的字符转换后的数字
public class Solution {
/**
* @param str: A string
* @return: An integer
*/
public int atoi(String str) {
// write your code here
int i=0,j=0;
int str_to_int = 0;
int asc=0;
//除去空字符串
str = str.trim();
for(;i<str.length();i++){
asc =(int)str.charAt(i);
//首位是否为符号
if(i==0){
if(asc==43||asc==45||(asc>=48&&asc<=57))
continue;
//首位不是符号也不是数字跳出
else
return 0;
}else {
//如果有小数点
if (asc==46) {
//判断左右是否为数字
if((int)str.charAt(i+1)>=48&&(int)str.charAt(i+1)<=57)
continue;
else
return 0;
}
//当遇到非数字跳出
if((asc<48||asc>57)&&asc!=46) {
//非数字前还是非数字返回0
if(str.charAt(i-1)<48||(int)str.charAt(i-1)>57)
return 0;
else
break;
}
}
}
//截取字符串
if(i>0){
str = str.substring(0,i);
}else{
return 0;
}
//无符号时,判断数字位前9为和214748364比较,如果大于直接返回,等于再比较最后一位
if(str.charAt(0)!='-'&&str.charAt(0)!='+'){
for(j=0;j<i;j++){
if(str.charAt(j)>=48&&str.charAt(j)<=57){
if(j<9){
str_to_int = str_to_int*10 + (int)str.charAt(j)-48;
}else{
if(Double.valueOf(str_to_int).intValue()>214748364){
return 2147483647;
}else if(Double.valueOf(str_to_int).intValue()==214748364){
if((int)str.charAt(j)>7)
return 2147483647;
}
}
}else{
return Double.valueOf(str.substring(0,j)).intValue();
}
}
}else{
//有符号时,去掉符号判断前九位与214748364比较,大于直接返回,等于再判断,分+-号判断
for(j=1;j<i;j++){
if(str.charAt(j)>=48&&str.charAt(j)<=57){
if(j<10){
str_to_int = str_to_int*10 + (int)str.charAt(j)-48;
}else{
if(Double.valueOf(str_to_int).intValue()>214748364){
return 2147483647;
}else if(Double.valueOf(str_to_int).intValue()==214748364){
if(str.charAt(0)=='-'){
if((int)str.charAt(j)-48>8){
return -2147483648;
}
}else{
if((int)str.charAt(j)-48>7){
return 2147483647;
}
}
}
}
}else{
return Double.valueOf(str.substring(0,j)).intValue();
}
}
}
return Double.valueOf(str.substring(0,j)).intValue();
}
}