8-字符串转换整数



方法:
这题的做法大概是这样:
- 去掉前导空格
- 再是处理正负号
- 识别数字,注意越界情况。
这道题目如果只是简单地字符串转整数的话,就是简单地rev=rev*10+pop。 但是注意这道题目可能会超过integer的最大表示! 也就是说会在某一步(1)rev*10+pop> Integer.MAX_VALUE。或者(2)rev*10+pop< Integer.MIN_VALUE。
(1)假如是第一个情况。要么rev>Integer.MAX_VALUE/10,此时rev*10之后必然越界。要么rev==Integer.MAX_VALUE/10&&pop>7,因为int类型最大值2147483647,个位就是7。Integer.MAX_VALUE/10*10之后是2147483640,比int最大值小7,如果pop<=7还是不过界的。
(2)第二个情况,int最小值:-2147483648,个位数是8,和上面一样。。。。
class Solution {
public int myAtoi(String str) {
int rev = 0;
char[] charList = str.toCharArray();
int length = str.length();
int zf = 1;//正负号
int i = 0;//到了str的哪一位
int pop = 0;//当前这一位的数
for(;i<str.length();i++)//此循环查找第一个非空字符串的位置
{
if(charList[i]==' ') continue;
else
{
if(charList[i] == '-'){
i++;
zf = -1;
break;
}
if(charList[i] == '+'){
i++;
break;
}
if(charList[i] <'0' || charList[i] >'9'){//不是数字
return 0;
}else{
break;
}
}
}
if(i==str.length()) return 0;//全都是空格,返回0.不用减一,如果上方循环一直continue,i会等于str.length()
for(;i<str.length();i++)
{
if(charList[i]<'0'||charList[i]>'9')return rev;//不是数字,则终止循环,返回rev
pop=(charList[i]-48)*zf;//字符转换为整数,减去48
if(rev>Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)){//最大值个位数是7,最小值个位数8,rev == Integer.MAX_VALUE/10时,rev乘以十之后,加上8就会越界。。。
return Integer.MAX_VALUE;
}
if(rev<Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)){
return Integer.MIN_VALUE;
}
rev=rev*10+pop;
}
return rev;
}
}
/*1.开头空格,丢弃
2.开头正负号,记下来,
开头不是数字,返回0
开头是数字,开始计数(题目其实是找出前几位构成的整数)*/

浙公网安备 33010602011771号