方法:
这题的做法大概是这样:
- 去掉前导空格
- 再是处理正负号
- 识别数字,注意越界情况。
这道题目如果只是简单地字符串转整数的话,就是简单地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 开头是数字,开始计数(题目其实是找出前几位构成的整数)*/