1.自己当时的思想
开始看到这道题的时候写了个大概,当时自己的思想:
先转化成数组,再遍历字符数组,把数字全部取出来,在判断最终是否大于MAX_VALUE或者小于MIN_VALUE就可以了,但是呢,在测试代码阶段感觉还可以就提交了,但是发现提交时候的样本测试不能通过,就开始了在源代码上维修自己的漏洞,这个测试没通过,价格if语句,又来一个测试样列,再加一个if,但是最终在测试样例‘-+12’和‘±12’之间,我加了几次if,发现不能解决这些小问题了。自此放弃了原来的思想,并且这时候代码变得十分冗余。
2.学习别人的思想;
力扣官方的解题思路我看了一下,我在结题评论中 选择了一个和自己思想比较符合的例子来玩成了这道题。由于测试案例中的‘-+’和‘±’,查看别人的代码后:
捋一下别人的思路:
2.1 设置初始的状态state=0;
当初始状态为0且遇到‘+’时,将state变为1
当初始状态为0遇到‘-’时,将state变为2
2.2 开始获取字符数组中的数组部分
用char[i]>=‘0’ 和char[i]<='9’判断
进图判断之后 将state设置为正数 1;
此时人家的代码 是每次得到一个数字,是在原来的基础上乘以10+这个数字(如 ls = ls*10+ 这个数),这样得到的也比较新颖(不像自己之前用的是stringbuilder来做的)
2.3 最后得到的数字判断他们的状态和max min大小即可完成;
3 代码
class Solution {
public int myAtoi(String s)
{
long ls = 0;
int state = 0;//设置状态 1位正 2位负
char[] cs = s.toCharArray();//转换为 字符数组 好遍历
for(int i =0 ;i<cs.length;i++){
if(state==0&&cs[i]==' ') continue;//空格 越过
else if(state==0&&cs[i]=='+' ) state = 1;//正数 改变 状态
else if(state==0&&cs[i]=='-') state =2;//负数改变状态
else if(cs[i]>='0'&&cs[i]<='9')//筛选 数字
{
if(state==0) state=1;
int tem = Character.getNumericValue(cs[i]);
ls = ls*10+tem;
if(ls>Integer.MAX_VALUE) break;//当数字大于max时候 不用再管了 最后返回的就是max
}
else break;//不是数字的时候怎么办
}
//接下来这些步骤也很重要,我开始写的一遍时候 ,每次超出数组大小返回的却不是max,最后我又重新写了一遍
if(state ==1 && ls>Integer.MAX_VALUE) ls = Integer.MAX_VALUE;
else if(state ==2 )
{
ls=-ls;
if(ls<Integer.MIN_VALUE) ls=Integer.MIN_VALUE;
}
return (int)ls;
}
}
4 小结
其中状态的设置很重要哦
当已经遍历完字符数组之后,就是对ls的判断,看他状态和max min 的值
当状态是1的时候 就看和max比较
当是2时候就要 取反,再看去和min大小,
最后返回的时候 再强转为INT
第一次写的时候 当超出INTEGER.MAX MIN大小范围时候返回了10…的一个很大的数,却没有返回max min ,所以在判断和max min大小也很重要。